local BattleEffect = require"Battle/Logic/BattleEffect/BattleEffect" local BuffManager = {} local private = {} local buffOp_Dic = {} local LuaConst=LuaConst local BuffTriggerType = LuaConst.BuffTriggerType local BuffTriggerType_BuffTrigger = BuffTriggerType.BuffTrigger local BuffTriggerType_InstantTrigger = BuffTriggerType.InstantTrigger local BuffTriggerType_LayerTrigger = BuffTriggerType.LayerTrigger local BuffTriggerType_DeleteTrigger = BuffTriggerType.DeleteTrigger local EConditionAimType_HOST = LuaConst.EConditionAimType.HOST local EConditionAimType_SUBJECT = LuaConst.EConditionAimType.SUBJECT local BuffTriggerActionType = LuaConst.EBuffTriggerActionType local BuffTriggerActionType_CallMissile = BuffTriggerActionType.CallMissile local BuffTriggerActionType_AddBuff = BuffTriggerActionType.AddBuff local BuffTriggerActionType_AccountDot = BuffTriggerActionType.AccountDot local BuffTriggerActionType_LimitAvoid = BuffTriggerActionType.LimitAvoid local BuffTriggerActionType_UseSkill = BuffTriggerActionType.UseSkill local BuffTriggerActionType_DeleteSelf = BuffTriggerActionType.DeleteSelf local BuffTriggerActionType_DeleteBuff = BuffTriggerActionType.DeleteBuff local BuffTriggerActionType_DeleteBuff_SameSource = BuffTriggerActionType.DeleteBuff_SameSource local BuffTriggerActionType_BattleEffect = BuffTriggerActionType.BattleEffect local table_insert=table.insert local ipairs = ipairs local pairs = pairs local CheckBuffImmune local CheckBuffExclusive local BUFFTYPE_FLAG = LuaConst.BuffType.FlagBuff local BUFFTYPE_ONCE = LuaConst.BuffType.OnceBuff local BuffImmuneCheckInfo local BuffExclusiveHaveDeleteAbilityDic local DataSheetManager = DataSheetManager local DataSheetBuffTriggerData = DataSheetManager.BuffTriggerData local ConditionManager_GetConditionDataTree = ConditionManager.GetConditionDataTree local ConditionManager_MeetCondition = ConditionManager.MeetCondition function BuffManager.Init() BuffManager.FilteredBuffIds = {} private.RecoverWhenExclusiveOffBuffDatas = {} local BuffOp_Instant = require "Battle/Logic/Buff/BuffManager/BuffOperator_Instant" local BuffOp_Sustained = require "Battle/Logic/Buff/BuffManager/BuffOperator_Sustained" local BuffOp_Dot = require "Battle/Logic/Buff/BuffManager/BuffOperator_Dot" local BuffOp_Halo = require "Battle/Logic/Buff/BuffManager/BuffOperator_Halo" local BuffOp_Flag = require "Battle/Logic/Buff/BuffManager/BuffOperator_Flag" local Enum_BuffType = LuaConst.BuffType buffOp_Dic[Enum_BuffType.OnceBuff] = BuffOp_Instant buffOp_Dic[Enum_BuffType.ContinueBuff] = BuffOp_Sustained buffOp_Dic[Enum_BuffType.DotBuff] = BuffOp_Dot buffOp_Dic[Enum_BuffType.HaloBuff] = BuffOp_Halo buffOp_Dic[Enum_BuffType.FlagBuff] = BuffOp_Flag BuffOp_Sustained.SetBuffOpDic(buffOp_Dic) --为了性能优化,这里把引用传给 BuffOp_Sustained ,减少 BuffOp_Sustained 查询时的消耗 BuffOp_Sustained.SetRecoverWhenExclusiveOffBuffDatas(private.RecoverWhenExclusiveOffBuffDatas) --为了性能优化,这里把引用传给 BuffOp_Sustained ,减少 BuffOp_Sustained 查询时的消耗 local BuffSystem = require "Battle/Logic/Entity/System/BuffSystem" BuffSystem.SetBuffOpDic(buffOp_Dic) --为了性能优化,这里把引用传给 BuffSystem ,减少 BuffSystem 查询时的消耗 CheckBuffImmune = DataSheetUtil.CheckBuffImmune CheckBuffExclusive = DataSheetUtil.CheckBuffExclusive BuffImmuneCheckInfo = DataSheetUtil.GetBuffImmuneCheckInfo() BuffExclusiveHaveDeleteAbilityDic = DataSheetUtil.GetBuffExclusiveHaveDeleteAbilityDic() BuffManager.PreprocessData() end --LevelManager的private.InitLevel调用结束 --※注意此时 CurLevelFunc 还没有调用InitLevel function BuffManager.BeforeLevelInit() buffOp_Dic[BUFFTYPE_ONCE].BeforeLevelInit() end function BuffManager.OnLevelInited() -- if not LevelManager.CurLevelCanRideHorse() then -- BuffManager.FilteredBuffIds[LuaConst.SpecialBuffs.CanRide] = true -- BuffManager.FilteredBuffIds[LuaConst.SpecialBuffs.ForceOffHorse] = true -- end end function BuffManager.ExitLevel() -- table.clear(BuffManager.FilteredBuffIds) end function BuffManager.PreprocessData() for _,data in DataSheetManager.BuffData:GetEnumerator() do if data.RecoverWhenExclusiveOff then table.insert(private.RecoverWhenExclusiveOffBuffDatas,data) end end end function BuffManager.GetRecoverWhenExclusiveOffBuffDatas() return private.RecoverWhenExclusiveOffBuffDatas end local KingdomNums = 4 local HeroTypeNums = 5 local SexualNums = 2 function BuffManager.IsMeetHeroTypeFilter(filterType, heroId) local heroData = DataSheetManager.HeroNum:GetDataByID(heroId) if heroData then local totalNums = KingdomNums + HeroTypeNums + SexualNums if filterType <= KingdomNums then return heroData.Kingdom == filterType elseif filterType <= (KingdomNums + HeroTypeNums) then return heroData.TypeID == (filterType - KingdomNums) elseif filterType <= totalNums then return heroData.Sexual == (filterType - (KingdomNums + HeroTypeNums)) end else return false end end function BuffManager.IsMeetHeroTypeFilterOfBuff(buffData,heroId) for index, filterType in ipairs(buffData.HeroTypeFilter) do if not BuffManager.IsMeetHeroTypeFilter(filterType, heroId) then return false end end return true end function BuffManager.TryAddBuff(buffId , entity,sourceEntity,buffCtrl ,buffAddDataList) if not buffAddDataList then SystemManager.AddBuff(entity,buffId,sourceEntity,nil,buffCtrl) return end local findVacancy = false for k,v in ipairs(buffAddDataList) do if not v.Actived then v.BuffID = buffId v.SourceEntityID = entity._logicInitData.EntityID v.CtrlParam = buffCtrl; v.Actived = true; findVacancy = true; break; end end if not findVacancy then local addData = RuntimeDataManager.New_BuffAdd() addData.BuffID = buffId addData.SourceEntityID = entity._logicInitData.EntityID addData.CtrlParam = buffCtrl; addData.Actived = true; table_insert(buffAddDataList,addData) end end --region ---------- buff免疫 ---------- function BuffManager.CheckBuffImmune(entity, checkBuffData) local buffcomp = entity.components.buff if not buffcomp then return end local checkBuffID, checkBuffGroupID = checkBuffData.BuffID, checkBuffData.BuffGroup for i, buffObject in ipairs(buffcomp.CurBuffObjectList) do if buffObject.NeedCheckImmune then local buffData = buffObject.BuffInfoData --local immuned = CheckBuffImmune(buffData.BuffID, checkBuffID, checkBuffGroupID) --old --new↓ 展开了 local immuneInfo = BuffImmuneCheckInfo[buffData.BuffID] if immuneInfo and (immuneInfo[checkBuffID] or immuneInfo[checkBuffGroupID]) then --new↑ local buffUpdateData = buffObject.BuffUpdateData local buffUpdateList = buffObject.BuffUpdateList if buffUpdateData and buffUpdateData.BuffLayer > 0 then return true ,buffData.BuffGroup end if buffUpdateList then for _,updateData in ipairs(buffUpdateList) do if updateData.BuffLayer > 0 then return true,buffData.BuffGroup end end end end end end return false end --endregion ---------- buff免疫 ---------- --region ---------- buff互斥 ---------- ----执行buff的互斥关系 function BuffManager.ExecuteBuffExclusive(entity, checkBuffData, hasBuff) local newBuff = not hasBuff local comp_Buff = entity.components.buff local checkBuffID, checkBuffGroupID = checkBuffData.BuffID, checkBuffData.BuffGroup if BuffExclusiveHaveDeleteAbilityDic[checkBuffID] == nil and BuffExclusiveHaveDeleteAbilityDic[checkBuffGroupID] == nil then return hasBuff end for i, buffObject in ipairs(comp_Buff.CurBuffObjectList) do if buffObject.NeedCheckExclusive then local buffData = buffObject.BuffInfoData local buffType = buffData.BuffType local buffID = buffData.BuffID if CheckBuffExclusive(buffID, buffData.BuffGroup, checkBuffID, checkBuffGroupID) then local buffUpdateData = buffObject.BuffUpdateData local buffUpdateList = buffObject.BuffUpdateList if buffUpdateData then if buffUpdateData.BuffLayer > 0 and (newBuff or buffType ~= BUFFTYPE_FLAG) then if buffID == checkBuffID then --如果把自己互斥掉就判断没有此Buff hasBuff = false end --展开以提升性能 之前是BuffManager.GetBuffOperator(buffType) buffOp_Dic[buffType].ExclusiveDelete(buffData, entity, checkBuffID, checkBuffGroupID, buffUpdateData) --BuffManager.TryExecuteBuffTrigger(entity, buffData, buffUpdateData, false) --old 性能不够好 local isSuccess, buffTriggerData = DataSheetBuffTriggerData:TryGetDataByBuffID(buffID) if isSuccess then BuffManager.ExecuteDeleteTrigger(entity, buffData, buffUpdateData, nil, buffTriggerData) --new 性能更好 end end else if buffUpdateList then local buffOperator = buffOp_Dic[buffType] for i,updateData in ipairs(buffUpdateList) do --标志Buff只有新加的Buff才会互斥掉 --普通Buff的互斥无限制 if updateData.BuffLayer > 0 and (newBuff or buffType ~= BUFFTYPE_FLAG) then if buffID == checkBuffID then --如果把自己互斥掉就判断没有此Buff hasBuff = false end buffOperator.ExclusiveDelete(buffData, entity, checkBuffID, checkBuffGroupID, updateData) --BuffManager.TryExecuteBuffTrigger(entity, buffData, updateData, false) --old 性能不够好 local isSuccess, buffTriggerData = DataSheetBuffTriggerData:TryGetDataByBuffID(buffID) if isSuccess then BuffManager.ExecuteDeleteTrigger(entity, buffData, updateData, nil, buffTriggerData) --new 性能更好 end end end end end end end end return hasBuff end --endregion ---------- buff互斥 ---------- --region ---------- buff触发 ---------- -----尝试执行Buff触发操作 function BuffManager.TryExecuteBuffCanTrigger(entity, buffData,sourceEntityID, sourceEntity) --检查是否触发已存在的Buff local canTriggerBuffs = DataSheetUtil.GetBuffCanTriggerData(buffData.BuffID) if canTriggerBuffs then private.TryCanTriggerBuffs(entity, buffData, sourceEntityID, sourceEntity, canTriggerBuffs) end canTriggerBuffs = DataSheetUtil.GetBuffCanTriggerData(buffData.BuffGroup) if canTriggerBuffs then private.TryCanTriggerBuffs(entity, buffData, sourceEntityID, sourceEntity, canTriggerBuffs) end end ----尝试执行Buff 被 触发操作(有性能消耗,最好不要调用,直接调用 BuffManager.ExecuteAddTrigger 或者 BuffManager.ExecuteDeleteTrigger) function BuffManager.TryExecuteBuffTrigger(entity, buffData,updateData, whenAdd, addList) if whenAdd then BuffManager.ExecuteAddTrigger(entity, buffData, updateData, addList) else BuffManager.ExecuteDeleteTrigger(entity, buffData, updateData, addList) end end ------选择需要执行操作的触发Buff function private.DoBuffTriggerAction(entity, buffObject,triggerData,sourceEntityID, sourceEntity, addList ) local buffUpdateData = buffObject.BuffUpdateData local buffUpdateList = buffObject.BuffUpdateList if buffUpdateData then private.ExecuteBuffTriggerAction(entity, buffObject.BuffInfoData, triggerData, sourceEntity, buffUpdateData, addList) end if buffUpdateList then --用来判断哪个Buff会触发 if sourceEntity then --寻找对应来源的buff for i,updateData in ipairs(buffUpdateList) do if updateData.SourceEntity == sourceEntity then private.ExecuteBuffTriggerAction(entity, buffObject.BuffInfoData,triggerData, sourceEntity, updateData, addList) break end end else --遍历所有Buff for i,updateData in ipairs(buffUpdateList) do private.ExecuteBuffTriggerAction(entity, buffObject.BuffInfoData, triggerData, sourceEntity, updateData, addList) end end end end -- function private.IsEffectActionType(actionType) -- return actionType == BuffTriggerActionType_BattleEffect -- end --事件触发buff的action -- params : 事件参数包 function BuffManager.ExecuteBuffEventTriggerAction(buff, buffData, triggerData,triggerSource, updateData, params) local target = nil local actionBodyType = triggerData.ActionBody if actionBodyType == 1 then --携带者 target = buff:GetHost() elseif actionBodyType == 2 then --来源者 target = updateData.SourceEntity elseif actionBodyType == 3 then --事件参数 target = params[triggerData.ActionBodyParam] elseif actionBodyType == 4 then -- 来源者最原始Entity target = updateData.SourceEntity:GetOriginEntity() else target = buff:GetHost() end if triggerData.ActionType == BuffTriggerActionType_BattleEffect then if target then BattleEffect.ExecuteByEffectId(triggerData.ActionParamInt1, params, updateData.SourceEntity, target) else logging.error(LTAG.ERROR, "HYW : ExecuteBuffEventTriggerAction target nil ERROR! buffID : ", buff.BuffID, "triggerData.ActionBody:", triggerData.ActionBody, "triggerData.TriggerType : ", triggerData.TriggerType) end else private.ExecuteBuffTriggerAction(buff:GetHost(), buffData, triggerData,triggerSource, updateData, nil, target, true) end end -----执行Buff触发的具体操作 --triggerSource">触发Buff的来源,对应触发类型2 function private.ExecuteBuffTriggerAction(entity, buffData, triggerData,triggerSource, updateData,addList, target, isFromEvent) local triggerEntity = target if not target then if triggerData.ActionBody == 1 then --携带者 triggerEntity = entity elseif triggerData.ActionBody == 2 then --来源者 triggerEntity = updateData.SourceEntity end end if not triggerEntity then return end if not isFromEvent then --只有非事件过来的才需要判定condition,事件过来的在BattleEventListener里就判定完了 if triggerData.EventConditionStr and triggerData.EventConditionStr ~= "" then local aim if triggerData.EventConditionAimType == EConditionAimType_HOST then aim = triggerEntity elseif triggerData.EventConditionAimType == EConditionAimType_SUBJECT then aim = entity else logging.error(LTAG.ERROR, "HYW : Buff触发表配置错误! 非事件类型(TriggerType < 10000)的触发的EventConditionAimType只支持0或1, 当前值 : ", triggerData.EventConditionAimType, " 出错的BuffTrigger ID : ", buffData.BuffID) end if aim then local conditionTree = ConditionManager_GetConditionDataTree(triggerData.EventConditionStr) if not ConditionManager_MeetCondition(aim, conditionTree) then return end end end end local sourceEntity = nil --条件Buff的来源 if triggerData.ActionType == BuffTriggerActionType_BattleEffect then BattleEffect.ExecuteByEffectId(triggerData.ActionParamInt1, nil, updateData.SourceEntity, triggerEntity) else if triggerData.ActionType == BuffTriggerActionType_CallMissile then SystemManager.TryToDoCall(triggerEntity, triggerData.ActionParamInt1, nil, LuaConst.ESkillMissileCallType.BUFFTRIGGER) elseif triggerData.ActionType == BuffTriggerActionType_AddBuff then if updateData.SourceEntity then sourceEntity = updateData.SourceEntity end BuffManager.TryAddBuff(triggerData.ActionParamInt1, triggerEntity, sourceEntity,addList and RuntimeDataManager.New_BuffCtrl(), addList) elseif triggerData.ActionType == BuffTriggerActionType_AccountDot then if buffData.BuffType == LuaConst.BuffType.DotBuff then local buffOperator = buffOp_Dic[buffData.BuffType] buffOperator.AccountDotHurt(triggerEntity, buffData, updateData) end elseif triggerData.ActionType == BuffTriggerActionType_LimitAvoid then if not triggerSource then return end local triggerCampID = triggerSource:GetCampID() local breakType = LuaConst.TimeScaleBreakType.HitBreak local duration = triggerData.ActionParamInt1 for k,entityItem in pairs(LogicUpdateManager._entityDic) do local entityCampid = entityItem:GetCampID() if entityCampid == triggerCampID then SystemManager.OnAddTimeScale(entityItem, "buff", triggerData.ActionParamFloat1, duration, breakType ) end end elseif triggerData.ActionType == BuffTriggerActionType_UseSkill then --logging.error(LTAG.ERROR, "HYW : action use skill : ", triggerData.ActionParamInt1) local curSkillData = entity.components.skillBase.CurSkillData if curSkillData == nil or curSkillData.ID ~= triggerData.ActionParamInt1 then if curSkillData then SystemManager.OnDeleteTimeScale(entity, curSkillData.ID, curSkillData.TimeScale) SystemManager.ChangeToSwitchAll(entity ,false, LuaConst.SkillInterruptType.BreakEffect) end --无视任何情况(如技能是否在CD中,是否被眩晕等),直接释放技能 SystemManager.SetNextState(LuaConst.StateType.Attack, entity, triggerData.ActionParamInt1, nil, nil) end elseif triggerData.ActionType == BuffTriggerActionType_DeleteSelf then SystemManager.DeleteBuff(entity,buffData.BuffID,triggerEntity) elseif triggerData.ActionType == BuffTriggerActionType_DeleteBuff then SystemManager.DeleteBuff(entity,triggerData.ActionParamInt1) elseif triggerData.ActionType == BuffTriggerActionType_DeleteBuff_SameSource then SystemManager.DeleteBuff(triggerEntity,triggerData.ActionParamInt1, updateData.SourceEntity) end end end ----添加Buff时根据已有Buff触发(对应TriggerType为2的)-- function private.TryCanTriggerBuffs( entity, buffData, sourceEntityID, sourceEntity, canTriggerBuffs) local triggerData = nil for i,canTriggeredBuff in ipairs(canTriggerBuffs)do local updateData local triggeredBuffData = DataSheetManager.BuffData:GetDataByBuffID(canTriggeredBuff.TriggerBuff) if triggeredBuffData.IsRecordSource and buffData.IsRecordSource then --都是记录来源的需要找同来源的 updateData = entity.components.buff:GetBuffUpdateDataSourced(canTriggeredBuff.TriggerBuff, sourceEntityID) else updateData = entity.components.buff:GetBuffUpdateData(canTriggeredBuff.TriggerBuff) end if updateData then triggerData = canTriggeredBuff.TriggerData if triggerData.TriggerType == BuffTriggerType_BuffTrigger then local buffObject = entity.components.buff:GetBuffObjectByBuffId(canTriggeredBuff.TriggerBuff) if buffObject then private.DoBuffTriggerAction(entity, buffObject, triggerData, sourceEntityID, sourceEntity) end end end end end -----添加Buff时触发(对应TriggerType为0和1的) function BuffManager.ExecuteAddTrigger(entity, buffData, updateData, addList, buffTriggerData) local canDoFunc = false --检查自己是否可以触发 if buffTriggerData == nil then local isSuccess isSuccess, buffTriggerData = DataSheetBuffTriggerData:TryGetDataByBuffID(buffData.BuffID) if not isSuccess then return end end local buffObject = nil if buffData.BuffType ~= BUFFTYPE_ONCE then buffObject = entity.components.buff:GetBuffObjectByBuffId(buffData.BuffID) if not buffObject then return end end for i,triggerData in ipairs(buffTriggerData.TriggerBuffData_Table) do canDoFunc = false if triggerData.TriggerType == BuffTriggerType_InstantTrigger then canDoFunc = true elseif triggerData.TriggerType == BuffTriggerType_LayerTrigger then canDoFunc = (updateData.BuffLayer == triggerData.TriggerParam) end if canDoFunc then local sid = -1 if updateData.SourceEntity then sid = updateData.SourceEntity._logicInitData.EntityID end if buffData.BuffType == BUFFTYPE_ONCE then --瞬时buff绕过DoBuffTriggerAction,直接ExecuteBuffTriggerAction --logging.error(LTAG.ERROR, "HYW : 瞬时buff绕过DoBuffTriggerAction,直接ExecuteBuffTriggerAction ") private.ExecuteBuffTriggerAction(entity,buffData,triggerData, updateData.SourceEntity, updateData,addList) else private.DoBuffTriggerAction(entity, buffObject, triggerData, sid, updateData.SourceEntity, addList) end end end end ---删除Buff时触发(对应TriggerType为3的) function BuffManager.ExecuteDeleteTrigger(entity, buffData,updateData, addList, buffTriggerData) if buffTriggerData == nil then local isSuccess isSuccess, buffTriggerData = DataSheetBuffTriggerData:TryGetDataByBuffID(buffData.BuffID) if not isSuccess then return end end for i,triggerData in ipairs(buffTriggerData.TriggerBuffData_Table) do if triggerData.TriggerType == BuffTriggerType_DeleteTrigger then local buffObject = entity.components.buff:GetBuffObjectByBuffId(buffData.BuffID) if buffObject then local sid = updateData.SourceEntity and updateData.SourceEntity._logicInitData.EntityID or -1 private.DoBuffTriggerAction(entity, buffObject, triggerData, sid, nil, addList) end end end end --endregion ---------- buff触发 ---------- --region ---------- buff位移 ---------- function BuffManager.CheckBuffMoveTime(moveData, defaultTime) if not moveData then return false, defaultTime end if moveData.HitType == LuaConst.BuffHitType.HitDragRange or moveData.HitType == LuaConst.BuffHitType.HitDragDistance then return true, moveData.MoveDuration end return false,defaultTime end function BuffManager.TryExecuteBuffMove(entity, moveData, buffData, hitMoveTime, hitDistance, hitMoveDir, hitMoveDirOffsetAngle,missile, sourceEntity) if not missile then return end if moveData then -- 有拖拽-优先 local hitType = moveData.HitType if hitType == LuaConst.BuffHitType.HitDragRange then local dragParam = { TerminalRadius = moveData.DragTerminalRadius, TerminalOffset = FP.newV2(moveData.DragTerminalOffsetX,moveData.DragTerminalOffsetZ), basePosType = moveData.BasePosType } SystemManager.OnHitDragRange(entity, sourceEntity, missile, moveData.MoveDuration, dragParam) elseif hitType == LuaConst.BuffHitType.HitDragDistance then local dragParam = { HorizontalDistance = moveData.HorizontalDistance, TerminalOffset = FP.newV2(moveData.DragTerminalOffsetX,moveData.DragTerminalOffsetZ), basePosType = moveData.BasePosType } SystemManager.OnHitDragDistance(entity, sourceEntity, missile, moveData.MoveDuration, dragParam) end else -- 普通击退 if (hitMoveTime and hitMoveTime > FP.Const.Zero) then SystemManager.OnHitPush(entity, sourceEntity, missile, hitMoveTime, hitDistance ,hitMoveDir, hitMoveDirOffsetAngle) end end end --endregion ---------- buff位移 ---------- --region ---------- buff描述拼接 ---------- ---@return string buffDescribe function BuffManager.BuffDescribeSplice(buffDescribe, buffFormula) local buffFormulaList = string.split(buffFormula, " ") local buffList = {} for i = 1, #buffFormulaList do local st = string.find(buffFormulaList[i], "(", 0, true) local v2 = string.split(string.sub(buffFormulaList[i], st + 1, #buffFormulaList[i] - 1), ",") for j = 1, #v2 do table.insert(buffList, v2[j]) end end for k,v in DataSheetManager.AttrData:GetEnumerator() do if v.AttrName == buffList[1] then buffList[1] = v.Name end if #buffList > 2 and v.AttrName == buffList[3] then buffList[3] = v.Name end end if #buffList == 2 then return string.FormatByIdsKey(buffDescribe, UIUtils.GetLocalizedTxt(Const_IDS[buffList[1]]), tostring(buffList[2] * 100).."%") elseif #buffList == 4 then return string.FormatByIdsKey(buffDescribe, UIUtils.GetLocalizedTxt(Const_IDS[buffList[1]]), tostring(buffList[2] * 100).."%", UIUtils.GetLocalizedTxt(Const_IDS[buffList[3]]), tostring(buffList[4] * 100).."%") end end --endregion ---------- buff描述拼接 ---------- function BuffManager.Dispose() buffOp_Dic[LuaConst.BuffType.HaloBuff].Dispose() end return BuffManager