local BuffStatistic = {} local private = { TotalBuffData = {}, EntityBuffData = {}, FrameBuffData = {} } local StatisticBuffTitle = { "BuffId", "CreateCount", "DeleteCount", "TotalLiveTime", } local StatisticEntityBuffTitle = { "EntityId", "HeroId", "BuffId", "CreateCount", "DeleteCount", "DeadDeleteCount", "BuffLiveTime", } local FrameBuffTitle = { "FrameId", "BuffId", "TotalBuffCount", "BuffCount", } function BuffStatistic.AddOneBuff(buffId, sourceEntity) local sourceEntityId = sourceEntity:GetEntityID() if not private.TotalBuffData[buffId] then private.TotalBuffData[buffId] = {} private.TotalBuffData[buffId].BuffId = buffId private.TotalBuffData[buffId].EntityBuffDatas = {} private.TotalBuffData[buffId].CreateCount = 0 private.TotalBuffData[buffId].DeleteCount = 0 private.TotalBuffData[buffId].TotalLiveTime = 0 end private.TotalBuffData[buffId].CreateCount = private.TotalBuffData[buffId].CreateCount + 1 if not private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId] then private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId] = {} private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].EntityId = sourceEntityId private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].HeroId = sourceEntity._logicInitData.CharacterID private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].BuffId = buffId private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].CreateCount = 0 private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].DeleteCount = 0 private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].DeadDeleteCount = 0 private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].BuffLiveTime = 0 end private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].CreateCount = private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].CreateCount + 1 if not private.EntityBuffData[sourceEntityId] then private.EntityBuffData[sourceEntityId] = {} end if not private.EntityBuffData[sourceEntityId][buffId] then private.EntityBuffData[sourceEntityId][buffId] = {} private.EntityBuffData[sourceEntityId][buffId].BuffCount = 0 private.EntityBuffData[sourceEntityId][buffId].BuffStartTime = LogicUpdateManager._clientHandleFrame end private.EntityBuffData[sourceEntityId][buffId].BuffCount = private.EntityBuffData[sourceEntityId][buffId].BuffCount + 1 end function BuffStatistic.DeleteOneBuff(buffId, sourceEntity, isDeadDelete) local sourceEntityId = sourceEntity:GetEntityID() if not private.EntityBuffData[sourceEntityId][buffId] then return end private.EntityBuffData[sourceEntityId][buffId].BuffCount = private.EntityBuffData[sourceEntityId][buffId].BuffCount - 1 private.TotalBuffData[buffId].DeleteCount = private.TotalBuffData[buffId].DeleteCount + 1 if isDeadDelete then private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].DeadDeleteCount = private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].DeadDeleteCount + 1 else private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].DeleteCount = private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].DeleteCount + 1 end if private.EntityBuffData[sourceEntityId][buffId].BuffCount <= 0 then local buffLiveTime = LogicUpdateManager._clientHandleFrame-private.EntityBuffData[sourceEntityId][buffId].BuffStartTime private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].BuffLiveTime = private.TotalBuffData[buffId].EntityBuffDatas[sourceEntityId].BuffLiveTime+buffLiveTime private.EntityBuffData[sourceEntityId][buffId] = nil end end function BuffStatistic.DeleteEntityBuff(entity) local buffObject = entity.components.buff.CurBuffObjectLinkedListHead while buffObject do local buffData = buffObject.BuffInfoData if buffData then -- 在dispose后,还可能走这块代码 if buffData.IsRecordSource then local buffUpdateList = buffObject.BuffUpdateList if buffUpdateList then for j,updateData in ipairs(buffUpdateList) do for i=1, updateData.BuffLayer do BuffStatistic.DeleteOneBuff(buffData.BuffID, entity, true) end end end else local buffUpdateData = buffObject.BuffUpdateData if buffUpdateData then for i=1, buffUpdateData.BuffLayer do BuffStatistic.DeleteOneBuff(buffData.BuffID, entity, true) end end end end buffObject = buffObject.nextBuffObject end end function BuffStatistic.AddFrameBuffData(buffId, entity, isValidBuff) local frameId = LogicUpdateManager._clientHandleFrame-1 if frameId>0 and frameId%100 == 0 then if not private.FrameBuffData[frameId] then private.FrameBuffData[frameId] = {} end if not private.FrameBuffData[frameId][buffId] then private.FrameBuffData[frameId][buffId] = {} private.FrameBuffData[frameId][buffId].FrameId = frameId private.FrameBuffData[frameId][buffId].BuffId = buffId private.FrameBuffData[frameId][buffId].TotalBuffCount = 0 private.FrameBuffData[frameId][buffId].BuffCount = 0 end private.FrameBuffData[frameId][buffId].TotalBuffCount = private.FrameBuffData[frameId][buffId].TotalBuffCount + 1 if isValidBuff then private.FrameBuffData[frameId][buffId].BuffCount = private.FrameBuffData[frameId][buffId].BuffCount + 1 end end end function BuffStatistic.ExportBuffData() BuffStatistic.ExportEntityBuffData() BuffStatistic.ExportTotalBuffData() BuffStatistic.ExportFrameBuffData() end function BuffStatistic.ExportEntityBuffData() local entityBuffDataStr = table.concat(StatisticEntityBuffTitle, ",") .. "\n" for buffId, buffData in pairs(private.TotalBuffData) do for entityId, entityBuffData in pairs(buffData.EntityBuffDatas) do private.TotalBuffData[buffId].TotalLiveTime = private.TotalBuffData[buffId].TotalLiveTime+entityBuffData.BuffLiveTime for __, entityBuffDataTitle in ipairs(StatisticEntityBuffTitle) do if entityBuffData[entityBuffDataTitle] then entityBuffDataStr = entityBuffDataStr .. entityBuffData[entityBuffDataTitle] .. "," end end entityBuffDataStr = entityBuffDataStr .. "\n" end end LuaExt.FileWriteText("BuffExport/EntityBuffDataExport.csv", entityBuffDataStr) private.EntityBuffData = {} end function BuffStatistic.ExportTotalBuffData() local dataStr = table.concat(StatisticBuffTitle, ",") .. "\n" for buffId, buffData in pairs(private.TotalBuffData) do for __, BuffDataTitle in ipairs(StatisticBuffTitle) do if buffData[BuffDataTitle] then dataStr = dataStr .. buffData[BuffDataTitle] .. "," end end dataStr = dataStr.."\n" end LuaExt.FileWriteText("BuffExport/TotalBuffDataExport.csv", dataStr) private.TotalBuffData = {} end function BuffStatistic.ExportFrameBuffData() for FrameId, frameBuffData in pairs(private.FrameBuffData) do local frameBuffDataStr = table.concat(FrameBuffTitle, ",") .. "\n" for __, buffData in pairs(frameBuffData) do for __, frameBuffTitle in ipairs(FrameBuffTitle) do if buffData[frameBuffTitle] then frameBuffDataStr = frameBuffDataStr .. buffData[frameBuffTitle] .. "," end end frameBuffDataStr = frameBuffDataStr.."\n" end LuaExt.FileWriteText("BuffExport/FrameBuffDataExport" .. FrameId .. ".csv", frameBuffDataStr) end private.FrameBuffData = {} end return BuffStatistic