PanicModeCombatAnalyzer = PanicModeCombatAnalyzer or {} PanicModeCombatAnalyzer.name = 'PanicModeCombatAnalyzer' PanicModeCombatAnalyzer.version = '1.0.1' PanicModeCombatAnalyzer.versionDB = 1 PanicModeCombatAnalyzer.loaded = false PanicModeCombatAnalyzer.author = 'silentgecko, deevilius' PanicModeCombatAnalyzer.savedVarsName = 'PMCAVars' PanicModeCombatAnalyzer.variables = { fights = {}, groups = {}, trials = {}, } PanicModeCombatAnalyzer.tempVars = { lastSave = 0, inFight = false, lastDps = 0, lastDpsCount = 0, trialRunning = false, trialId = 0, } -- grab ftc from global FTC = _G['FTC'] ---------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) EVENT_MANAGER:RegisterForEvent(self.name, EVENT_PLAYER_COMBAT_STATE, self.OnPlayerCombatState) --trials EVENT_MANAGER:RegisterForEvent(self.name .. "_TRIAL_START", EVENT_RAID_TRIAL_STARTED, self.saveTrials) EVENT_MANAGER:RegisterForEvent(self.name .. "_TRIAL_STOP", EVENT_RAID_TRIAL_COMPLETE, self.saveTrials) EVENT_MANAGER:RegisterForEvent(self.name .. "_TRIAL_STOP", EVENT_RAID_TRIAL_FAILED, self.saveTrials) EVENT_MANAGER:RegisterForEvent(self.name .. "_TRIAL_STOP_GROUP", EVENT_GROUP_MEMBER_LEFT, self.saveTrialsFromGroup) EVENT_MANAGER:RegisterForEvent(self.name .. "_GROUP_CHANGE", EVENT_GROUP_MEMBER_JOINED, self.saveGroup) EVENT_MANAGER:RegisterForEvent(self.name .. "_GROUP_CHANGE", EVENT_GROUP_MEMBER_LEFT, self.saveGroup) EVENT_MANAGER:RegisterForEvent(self.name .. "_GROUP_CHANGE", EVENT_GROUP_UPDATE, self.saveGroup) end function PanicModeCombatAnalyzer.OnPlayerCombatState(_, inCombat) PanicModeCombatAnalyzer.tempVars.inFight = inCombat end function PanicModeCombatAnalyzer.saveTrials(event) local self = PanicModeCombatAnalyzer local timeStamp = GetTimeStamp() local currentRaid = GetCurrentParticipatingRaidId() local eventStr = 'start' if event == 131134 or event == '131134' then self.tempVars.trialRunning = true self.tempVars.trialId = currentRaid else eventStr = 'stop' self.tempVars.trialRunning = false end self.savedVariables.trials[currentRaid] = self.savedVariables.trials[currentRaid] or {} self.savedVariables.trials[currentRaid][timeStamp] = eventStr end function PanicModeCombatAnalyzer.saveTrialsFromGroup(_, _, reason) local self = PanicModeCombatAnalyzer local timeStamp = GetTimeStamp() local currentRaid = self.tempVars.trialId -- we use our tempvar, because when you zone out of trial, and still in grp, raidid from api is 0 local eventStr = 'stop' if (reason == GROUP_LEAVE_REASON_DISBAND or reason == GROUP_LEAVE_REASON_DESTROYED) and currentRaid > 0 and self.tempVars.trialRunning then self.savedVariables.trials[currentRaid] = self.savedVariables.trials[currentRaid] or {} self.savedVariables.trials[currentRaid][timeStamp] = eventStr self.tempVars.trialRunning = false end end function PanicModeCombatAnalyzer.saveGroup() local self = PanicModeCombatAnalyzer local timeStamp = GetTimeStamp() local groupSize = GetGroupSize() local group = {} -- iterate over group if groupSize > 0 then self.savedVariables.groups[timeStamp] = self.savedVariables.groups[timeStamp] or {} 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 self.savedVariables.groups[timeStamp] = group self.debug('saved grp', self.savedVariables.groups[timeStamp]) end end --[[ * Overwrite from origin FTC * Update the mini DPS meter * -------------------------------- * Called by FTC.Stats:Initialize() * -------------------------------- ]]-- function FTC.Stats:Update() local self = PanicModeCombatAnalyzer -- Bail out if there is no damage to report if ( FTC.Stats.damage == 0 and FTC.Stats.healing == 0 ) then return end -- Retrieve data local mini = _G["FTC_MiniMeter"] -- Compute the fight time local time = ( FTC.Stats.endTime - FTC.Stats.startTime ) / 1000 -- Determine the correct time label local dtime = (( not IsUnitInCombat('player') ) or ((( GetGameTimeMilliseconds() - FTC.Stats.endTime ) / 1000 ) >= FTC.Vars.DamageTimeout )) and time or ( GetGameTimeMilliseconds() - FTC.Stats.startTime ) / 1000 local secs = ZO_FormatTime( dtime , SI_TIME_FORMAT_TIMESTAMP) -- Compute player statistics local dps = FTC.DisplayNumber( FTC.Stats.damage / math.max(time, 1) ) local hps = FTC.DisplayNumber( FTC.Stats.healing / math.max(time, 1) ) -- added saving vars local lastSave = self.tempVars.lastSave local currentTime = GetGameTimeMilliseconds() local timeStamp = GetTimeStamp() local lastSaveDiff = currentTime - lastSave local currenTarget = GetUnitName('reticleover') local dpsForSaving = (FTC.Stats.damage / math.max(time,1)) if self.tempVars.lastDps == dpsForSaving then self.tempVars.lastDpsCount = self.tempVars.lastDpsCount + 1 else self.tempVars.lastDpsCount = 0 end self.tempVars.lastDps = dpsForSaving -- only save if we don't get three times the same amount of dps, and lastSavediff is more than one second ago and we're in fight if self.tempVars.lastDpsCount <= 2 and lastSaveDiff >= 1000 and self.tempVars.inFight then self.tempVars.lastSave = currentTime self.savedVariables.fights[currenTarget] = self.savedVariables.fights[currenTarget] or {} self.savedVariables.fights[currenTarget][timeStamp] = dpsForSaving end -- Update the labels mini.damage.label:SetText( dps ) mini.healing.label:SetText( hps ) mini.time.label:SetText( secs ) 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)