PanicModeCombatAnalyzer = PanicModeCombatAnalyzer or {} PanicModeCombatAnalyzer.name = 'PanicModeCombatAnalyzer' PanicModeCombatAnalyzer.version = '1.0.3' 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) -- reset previously saved data -- if self.savedVariables.fights ~= nil then -- self.savedVariables.fights = nil -- end -- if self.savedVariables.groups ~= nil then -- self.savedVariables.groups = nil -- end -- if self.savedVariables.trials ~= nil then -- self.savedVariables.trials = nil -- end -- todo cleanup old data --save current server and language self.savedVariables.metadata = { server = GetWorldName(), language = GetCVar('language.2') } EVENT_MANAGER:RegisterForEvent(self.name, EVENT_PLAYER_COMBAT_STATE, self.OnPlayerCombatState) CALLBACK_MANAGER:RegisterCallback("FTC_NewDamage", self.addDamage) end function PanicModeCombatAnalyzer.OnPlayerCombatState(_, inCombat) PanicModeCombatAnalyzer.tempVars.inFight = inCombat end 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 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'], damage = damage['value'], crit = damage['crit'], ms = damage['ms'], ability = damage['ability'], } if damage['heal'] then local currentData = data[lastSaveTS]['healing'][damage['target']] or {} table.insert(currentData, damageData) data[lastSaveTS]['healing'][damage['target']] = currentData else local currentData = data[lastSaveTS]['damage'][damage['target']] or {} table.insert(currentData, damageData) data[lastSaveTS]['damage'][damage['target']] = currentData end data[lastSaveTS]['group'] = self.getGroup() data[lastSaveTS]['trial'] = self.getTrial() self.savedVariables.data[lastSaveTS] = data[lastSaveTS] table.sort(self.savedVariables.data[lastSaveTS]) end end 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("<<!aC:1>>", 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 -- deep copy of table function PanicModeCombatAnalyzer.copyTableAndClean(orig) local self = PanicModeCombatAnalyzer local orig_type = type(orig) local copy if orig_type == 'table' then copy = {} for orig_key, orig_value in next, orig, nil do if orig_key ~= 'Total' and orig_key ~= 'icon' then copy[self.copyTableAndClean(orig_key)] = self.copyTableAndClean(orig_value) end end setmetatable(copy, self.copyTableAndClean(getmetatable(orig))) else -- number, string, boolean, etc copy = orig end return copy end ---------Events------- EVENT_MANAGER:RegisterForEvent(PanicModeCombatAnalyzer.name, EVENT_ADD_ON_LOADED, PanicModeCombatAnalyzer.Initialize)