--------瞬时Buff------ local BuffOperator_Instant = {} local FormulaCalculator = require "Battle/Logic/Missile/FormulaCalculator" local tempUpdateDataPool = {RuntimeDataManager.New_BuffUpdate(),RuntimeDataManager.New_BuffUpdate(),RuntimeDataManager.New_BuffUpdate()} local EventSystem = require('Event/EventSystem') local BattleEffect = require"Battle/Logic/BattleEffect/BattleEffect" --LevelManager的private.InitLevel调用结束 --※注意此时 CurLevelFunc 还没有调用InitLevel function BuffOperator_Instant.BeforeLevelInit() --关卡初始化阶段重置临时池子,防止缓存污染 tempUpdateDataPool = {RuntimeDataManager.New_BuffUpdate(),RuntimeDataManager.New_BuffUpdate(),RuntimeDataManager.New_BuffUpdate()} end function BuffOperator_Instant.GetBuffUpdateFromPool() --因为会递归调用,所以不能像之前那样简单复用tempUpdateData了,搞个简单的池 local tempUpdateData = nil if #tempUpdateDataPool > 0 then tempUpdateData = tempUpdateDataPool[#tempUpdateDataPool] tempUpdateDataPool[#tempUpdateDataPool] = nil RuntimeDataManager.Reset_BuffUpdate(tempUpdateData) else tempUpdateData = RuntimeDataManager.New_BuffUpdate() end return tempUpdateData end function BuffOperator_Instant.FreeBuffUpdate(buffUpdateData) tempUpdateDataPool[#tempUpdateDataPool + 1] = buffUpdateData end function BuffOperator_Instant.Add(buffData,targetEntity,sourceEntity,missile,ctrlParam,index) --如果死亡则不会触发瞬时Buff if not targetEntity.components.attr:IsAlive() then return nil end local tempUpdateData = BuffOperator_Instant.GetBuffUpdateFromPool() if buffData.IsRecordSource and sourceEntity then tempUpdateData.SourceEntity = sourceEntity else tempUpdateData.SourceEntity = nil end tempUpdateData.MissileHurtID = ctrlParam.MissileHurtID tempUpdateData.IsTracker = ctrlParam.IsTracker tempUpdateData.BuffOverRideFomula = ctrlParam.BuffOverRideFomula tempUpdateData.BuffLayer = ctrlParam.ForceLayer tempUpdateData.MissileOfInstantBuff = missile if missile then tempUpdateData.MissileHitCount = missile.CurFrameHitEntityCount local dynamicDmgFactor = missile:GetDynamicDamageFactor() if dynamicDmgFactor and dynamicDmgFactor ~= FP.Const.One then tempUpdateData.MissileDamageFactor = missile:GetDynamicDamageFactor() end end BuffOperator_Instant.Execute(buffData, targetEntity, sourceEntity, tempUpdateData ,ctrlParam.HpChangeType) BuffOperator_Instant.AddHandles(buffData, targetEntity, sourceEntity, ctrlParam) SystemManager.ShowPSEffect(targetEntity, targetEntity.components.replace:GetCurModelBuffResource(buffData) ) if not string.isNilOrEmpty(buffData.QueueResource) then SystemManager.AddQueueEffect(targetEntity, buffData.QueueResource) end return tempUpdateData end function BuffOperator_Instant.Refresh(buffData,targetEntity,sourceEntity,missile,ctrlParam,index) return BuffOperator_Instant.Add(buffData,targetEntity,sourceEntity,missile,ctrlParam,index) end function BuffOperator_Instant.Delete(buffData, entity, updateData, addList) end function BuffOperator_Instant.ExclusiveDelete(buffData, entity, addBuffIdExclus, addBuffGroupExclus, updateData) end function BuffOperator_Instant.Execute(buffData, targetEntity, sourceEntity, updateData , hpChangeType) BuffOperator_Instant.CastStartEffect(buffData,updateData,sourceEntity,targetEntity) --主视角事件 if sourceEntity == LogicUpdateManager._curEntity or (LogicUpdateManager._curEntity and sourceEntity == LogicUpdateManager._curEntity.components.adjutant.AdjutantEntity) then if updateData.MissileHurtID and not (hpChangeType == LuaConst.EHpChangeType.DOT) then --不知道为什么dot不派发事件出去 --因为策划规定dot伤害不计连击数 local attr = targetEntity.components.attr local beforeHP = attr.hp[1] FormulaCalculator.CalculateResult(buffData,updateData,targetEntity,sourceEntity, 1,hpChangeType) if attr.hp[1] < beforeHP then EventSystem.Dispatch(EventID.Level_HitEnemy) end else FormulaCalculator.CalculateResult(buffData,updateData,targetEntity,sourceEntity, 1,hpChangeType) end else FormulaCalculator.CalculateResult(buffData,updateData,targetEntity,sourceEntity, 1,hpChangeType) end end function BuffOperator_Instant.CastStartEffect(buffData,updateData,sourceEntity,targetEntity) BuffOperator_Instant.CastEffects(buffData.StartEffects,updateData,sourceEntity,targetEntity) end function BuffOperator_Instant.CastEffects(effectIdList,updateData,sourceEntity,targetEntity) if effectIdList then for i,effectID in ipairs(effectIdList) do BuffOperator_Instant.CastEffect(effectID,updateData,sourceEntity,targetEntity) end end end function BuffOperator_Instant.CastEffect(effectID,updateData,sourceEntity,targetEntity) if effectID and effectID > 0 then local effectParams = {} effectParams.buffUpdateData = updateData BattleEffect.ExecuteByEffectId(effectID,effectParams,sourceEntity,targetEntity) end end function BuffOperator_Instant.AddHandles(buffData, targetEntity, sourceEntity, ctrlParam) --以下代码应该没问题 ,在子弹trigger的时候,一次性buff只有在hp>0才执行 if(targetEntity.components.attr.hp <= FP.Const.Zero) then local lastDeadFrame = targetEntity.components.record.lastDeadFrame if lastDeadFrame == nil or lastDeadFrame < LogicUpdateManager._clientHandleFrame then --2022年7月19日新增判断,如果上次死亡不在本帧,才调用SystemManager.OnDead,防止同一帧多次死亡(因为之前代码不够健壮所以可能出现同一帧调用多次SystemManager.OnDead的情况,比如被曹仁反伤死时) local killer = sourceEntity:GetMasterEntity() or sourceEntity targetEntity.components.record.KillerEntity = killer SystemManager.OnDead(targetEntity, ctrlParam.MissileHurtID) end end end function BuffOperator_Instant.DeleteHandles(buffData, targetEntity) end function BuffOperator_Instant.OnBuffAdded(entity,buffId,updateData) BuffOperator_Instant.FreeBuffUpdate(updateData) end return BuffOperator_Instant