PanicModeCombatAnalyzer = PanicModeCombatAnalyzer or {} PanicModeCombatAnalyzer.name = 'PanicModeCombatAnalyzer' PanicModeCombatAnalyzer.version = '1.0.8' PanicModeCombatAnalyzer.versionDB = 2 PanicModeCombatAnalyzer.loaded = false PanicModeCombatAnalyzer.author = 'silentgecko, deevilius' PanicModeCombatAnalyzer.savedVarsName = 'PMCAVars' PanicModeCombatAnalyzer.variables = { data = {}, metadata = { server = 'EU', language = 'de', } } PanicModeCombatAnalyzer.tempVars = { lastSave = 0, lastSaveTimeStamp = 0, inFight = false, lastDps = 0, lastDpsCount = 0, trialRunning = false, trialId = 0, } ---------Passing saved variables to the labels at initialize------- function PanicModeCombatAnalyzer.Initialize(_, addonName) local self = PanicModeCombatAnalyzer if addonName ~= self.name then return end EVENT_MANAGER:UnregisterForEvent(self.name, EVENT_ADD_ON_LOADED) self.savedVariables = ZO_SavedVars:New(self.savedVarsName, self.versionDB, nil, self.variables) --save current server and language self.savedVariables.metadata = { server = GetWorldName(), language = GetCVar('language.2') } self.cleanUp() EVENT_MANAGER:RegisterForEvent(self.name, EVENT_PLAYER_DEAD, self.onDeath) CALLBACK_MANAGER:RegisterCallback("FTC_NewDamage", self.addDamage) end -- cleanup function PanicModeCombatAnalyzer.cleanUp() local self = PanicModeCombatAnalyzer local savedVars = self.savedVariables.data local currentTs = GetTimeStamp() local limitTs = currentTs - 604800 -- one week in seconds for ts, data in pairs(savedVars) do if ts <= limitTs then self.savedVariables.data[ts] = nil end end end -- get current trial function PanicModeCombatAnalyzer.getTrial() local self = PanicModeCombatAnalyzer local currentRaid = GetCurrentParticipatingRaidId() or 0 return currentRaid end -- get dmg from FTC function PanicModeCombatAnalyzer.addDamage(damage) local self = PanicModeCombatAnalyzer --only log outgoing stuff and greater than zero if damage['out'] and damage['value'] > 0 and damage['target'] ~= '' then local data = self.savedVariables.data or {} local lastSave = self.tempVars.lastSave local lastSaveTS = self.tempVars.lastSaveTimeStamp local currentTime = GetGameTimeMilliseconds() local timeStamp = GetTimeStamp() local lastSaveDiff = currentTime - lastSave -- if the last saving data is 1 sek ago, make a new table if lastSaveDiff >= 1000 then lastSaveTS = timeStamp self.tempVars.lastSaveTimeStamp = timeStamp self.tempVars.lastSave = currentTime end data[lastSaveTS] = data[lastSaveTS] or {} data[lastSaveTS]['damage'] = data[lastSaveTS]['damage'] or {} data[lastSaveTS]['healing'] = data[lastSaveTS]['healing'] or {} local damageData = { abilityId = damage['abilityId'], value = damage['value'], crit = damage['crit'], ms = damage['ms'], } if damage['heal'] then --filter unwanted stuff if damage['result'] == ACTION_RESULT_HEAL or damage['result'] == ACTION_RESULT_CRITICAL_HEAL or damage['result'] == ACTION_RESULT_HOT_TICK or damage['result'] == ACTION_RESULT_HOT_TICK_CRITICAL then local currentData = data[lastSaveTS]['healing'][damage['target']] or {} table.insert(currentData, damageData) if next(currentData) ~=nil then data[lastSaveTS]['healing'][damage['target']] = currentData end end else --filter unwanted stuff if damage['result'] == ACTION_RESULT_DAMAGE or damage['result'] == ACTION_RESULT_CRITICAL_DAMAGE or damage['result'] == ACTION_RESULT_DOT_TICK or damage['result'] == ACTION_RESULT_DOT_TICK_CRITICAL then local currentData = data[lastSaveTS]['damage'][damage['target']] or {} table.insert(currentData, damageData) if next(currentData) ~=nil then data[lastSaveTS]['damage'][damage['target']] = currentData end end end -- only store, when we have damage or healing if next(data[lastSaveTS]['damage']) ~= nil or next(data[lastSaveTS]['healing']) ~= nil then data[lastSaveTS]['group'] = self.getGroup() data[lastSaveTS]['trial'] = self.getTrial() self.savedVariables.data[lastSaveTS] = data[lastSaveTS] end end end -- player death / revive function PanicModeCombatAnalyzer.onDeath(event) local self = PanicModeCombatAnalyzer local timeStamp = GetTimeStamp() local data = self.savedVariables.data or {} data[timeStamp] = data[timeStamp] or {} if (event == EVENT_PLAYER_DEAD) then -- player died data[timeStamp]['event'] = 'died' else -- player lives again data[timeStamp]['event'] = 'revive' end self.savedVariables.data[timeStamp] = data[timeStamp] end -- get group function PanicModeCombatAnalyzer.getGroup() local self = PanicModeCombatAnalyzer local groupSize = GetGroupSize() local group = {} -- iterate over group if groupSize > 0 then for i = 1, groupSize do local unitTag = GetGroupUnitTagByIndex(i) if (DoesUnitExist(unitTag)) then local charName = zo_strformat("<>", GetUnitName(unitTag)) table.insert(group, charName) end end end return group end -- debug func function PanicModeCombatAnalyzer.debug(message, data) d('PM CA Debug:') d(message, data) end ---------Events------- EVENT_MANAGER:RegisterForEvent(PanicModeCombatAnalyzer.name, EVENT_ADD_ON_LOADED, PanicModeCombatAnalyzer.Initialize)