Nenue@0: local B = select(2,...).frame Nenue@18: local wipe, pairs, ipairs, min, max, unpack, format = table.wipe, pairs, ipairs, min, max, unpack, format Nenue@18: local tinsert, tostring = tinsert, tostring Nenue@18: local GetQuestTagInfo, GetQuestLogTitle = GetQuestTagInfo, GetQuestLogTitle Nenue@18: local GetNumQuestLogEntries, GetNumQuestWatches, GetQuestLogCompletionText, IsQuestWatched, IsQuestHardWatched, GetQuestLogSpecialItemInfo, GetQuestLogSpecialItemCooldown = GetNumQuestLogEntries, GetNumQuestWatches, GetQuestLogCompletionText, IsQuestWatched, IsQuestHardWatched, GetQuestLogSpecialItemInfo, GetQuestLogSpecialItemCooldown Nenue@18: local GetNumAutoQuestPopUps, GetAutoQuestPopUp, GetTasksTable, GetNumQuestLogTasks, GetTaskInfo, GetQuestObjectiveInfo = GetNumAutoQuestPopUps, GetAutoQuestPopUp, GetTasksTable, GetNumQuestLogTasks, GetTaskInfo, GetQuestObjectiveInfo Nenue@18: local GetNumQuestLogRewardCurrencies, GetQuestLogRewardCurrencyInfo, GetNumQuestLogRewards, GetQuestLogRewardInfo, GetQuestLogRewardMoney, GetMoneyString = GetNumQuestLogRewardCurrencies, GetQuestLogRewardCurrencyInfo, GetNumQuestLogRewards, GetQuestLogRewardInfo, GetQuestLogRewardMoney, GetMoneyString Nenue@0: local GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo = GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo Nenue@16: local GetQuestWatchIndex, GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo = GetQuestWatchIndex, GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo Nenue@18: local QuestHasPOIInfo, GetDistanceSqToQuest, GetQuestFactionGroup = QuestHasPOIInfo, GetDistanceSqToQuest, GetQuestFactionGroup Nenue@18: local GetTrackedAchievements, GetNumTrackedAchievements, GetAchievementInfo = GetTrackedAchievements, GetNumTrackedAchievements, GetAchievementInfo Nenue@0: local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') Nenue@14: local print = B.print('TrackerInfo') Nenue@18: local QUEST_TAG_DUNGEON = QUEST_TAG_DUNGEON Nenue@18: local QUEST_TAG_GROUP = QUEST_TAG_GROUP Nenue@18: local QUEST_TAG_ACCOUNT = QUEST_TAG_ACCOUNT Nenue@18: local QUEST_TAG_TCOORDS = QUEST_TAG_TCOORDS Nenue@18: local LE_QUEST_FREQUENCY_DAILY = LE_QUEST_FREQUENCY_DAILY Nenue@18: local LE_QUEST_FREQUENCY_WEEKLY = LE_QUEST_FREQUENCY_WEEKLY Nenue@18: local FACTION_ALLIANCE, LE_QUEST_FACTION_HORDE, FACTION_HORDE, LE_QUEST_FACTION_HORDE = FACTION_ALLIANCE, LE_QUEST_FACTION_HORDE, FACTION_HORDE, LE_QUEST_FACTION_HORDE Nenue@0: Nenue@19: local Tracker, Bonus, AutoQuest, Quest, Cheevs = mod.DefaultTracker, mod.Bonus, mod.AutoQuest, mod.Quest, mod.Cheevs Nenue@0: -------------------------------------------------------------------- Nenue@0: --- Tracker-specific data retrieval functions Nenue@0: -------------------------------------------------------------------- Nenue@13: Nenue@13: Nenue@13: ----------------------------- Nenue@13: --- AUTO_QUEST Nenue@16: AutoQuest.LogInfo = {} Nenue@16: AutoQuest.LogBlock = {} Nenue@16: AutoQuest.QuestBlock = {} Nenue@16: AutoQuest.WatchBlock = {} Nenue@19: function AutoQuest:GetNumWatched () Nenue@19: print(self.name, self) Nenue@19: self.numWatched = GetNumAutoQuestPopUps() Nenue@19: return self.numWatched Nenue@16: end Nenue@16: AutoQuest.GetInfo = function(self, popupIndex) Nenue@16: Nenue@16: local questID, type = GetAutoQuestPopUp(popupIndex) Nenue@16: local questIndex = GetQuestLogIndexByID(questID) Nenue@16: local questWatchIndex = GetQuestWatchIndex(questIndex) Nenue@16: Nenue@16: local questInfo = Quest:GetInfo(questWatchIndex) Nenue@16: self.Info[questID] = { Nenue@16: title = questInfo.title, Nenue@16: description = type, Nenue@16: popupType = type, Nenue@16: questID = questID, Nenue@16: questIndex = questIndex, Nenue@16: popupIndex = popupIndex, Nenue@16: watchIndex = questWatchIndex, Nenue@16: numObjectives = 0 Nenue@16: } Nenue@16: Nenue@16: Nenue@16: return self.Info[questID] Nenue@13: end Nenue@13: Nenue@13: ----------------------------- Nenue@14: --- BONUS OBJECTIVE Nenue@14: Bonus.TasksTable = {} Nenue@14: Bonus.TasksPOI = {} Nenue@14: Bonus.TaskScenario = {} Nenue@14: Nenue@14: local taskData = {} Nenue@14: Bonus.QuestBlock = {} Nenue@16: Bonus.TaskWatch = {} Nenue@19: function Bonus:GetNumWatched () Nenue@19: print(self.name, self) Nenue@16: local tasks = GetTasksTable() Nenue@14: local numTasks = 0 Nenue@16: Bonus.TaskWatch = {} Nenue@16: print('|cFFFFFF00Bonus.GetNumWatched()|r', #tasks) Nenue@16: for i, questID in ipairs(tasks) do Nenue@16: local t = Bonus.StoreTask(questID) Nenue@16: print (' taskIndex', i, 'questID', questID) Nenue@16: print(' isComplete', t.isComplete) Nenue@16: if (t.inInArea or t.isOnMap) and not t.isComplete then Nenue@14: numTasks = numTasks + 1 Nenue@16: Bonus.TaskWatch[numTasks] = t Nenue@14: end Nenue@14: end Nenue@14: Bonus.numAll = #Bonus.TasksTable Nenue@14: Bonus.numWatched = numTasks Nenue@14: return GetNumQuestLogTasks() Nenue@14: end Nenue@16: Nenue@16: Bonus.GetInfo = function(self, taskIndex) Nenue@19: print(self.name, self) Nenue@16: return Bonus.TaskWatch[taskIndex] Nenue@16: end Nenue@16: Nenue@16: Bonus.StoreTask = function(questID) Nenue@16: Nenue@14: if not questID then Nenue@16: print('|cFFFF4400invalid quest ID', questID) Nenue@14: return Nenue@14: end Nenue@14: Nenue@16: Bonus.Info[questID] = Bonus.Info[questID] or {} Nenue@16: local t = Bonus.Info[questID] Nenue@16: local isInArea, isOnMap, numObjectives = GetTaskInfo(questID) Nenue@16: t.questID = questID Nenue@16: t.numObjectives = numObjectives Nenue@16: t.isInArea = isInArea Nenue@16: t.isOnMap = isOnMap Nenue@14: Nenue@16: print(' isInArea', isInArea, 'isOnMap', isOnMap, 'numObj', numObjectives) Nenue@16: local displayObjectives = false Nenue@16: local isComplete = true Nenue@16: if numObjectives >= 1 then Nenue@16: print(' ', numObjectives,'objective rows') Nenue@14: t.objectives = {} Nenue@14: for i = 1, t.numObjectives do Nenue@14: t.objectives[i] = {} Nenue@14: local o = t.objectives[i] Nenue@14: o.index = i Nenue@16: --local text, objectiveType, finished, displayAsObjective = Nenue@16: o.text, o.objectiveType, o.finished, o.displayAsObjective = GetQuestObjectiveInfo(questID, i, false) Nenue@14: Nenue@14: print(i, '==>', o.text, o.objectiveType, o.finished, o.displayAsObjective) Nenue@14: t.displayObjectives = t.displayObjectives or o.displayAsObjective Nenue@14: t.isComplete = t.isComplete and o.finished Nenue@14: Nenue@14: end Nenue@14: end Nenue@16: Nenue@16: t.displayObjectives = displayObjectives Nenue@16: Nenue@16: Nenue@16: local rewards = {} Nenue@16: t.numCurrencies = GetNumQuestLogRewardCurrencies(questID) Nenue@16: for i = 1, t.numCurrencies do Nenue@16: local name, texture, count = GetQuestLogRewardCurrencyInfo(i, questID) Nenue@16: tinsert(rewards,{ Nenue@16: type = 'currency', Nenue@16: index = i, Nenue@16: name = name, Nenue@16: texture = texture, Nenue@16: count = count Nenue@16: }); Nenue@16: end Nenue@16: -- items Nenue@16: t.numItems = GetNumQuestLogRewards(questID) Nenue@16: for i = 1, t.numItems do Nenue@16: local name, texture, count, quality, isUsable = GetQuestLogRewardInfo(i, questID) Nenue@16: tinsert(rewards, { Nenue@16: type = 'item', Nenue@16: index = i , Nenue@16: name = name, Nenue@16: texture = texture, Nenue@16: count = count, Nenue@16: quality = quality, Nenue@16: isUsable = isUsable Nenue@16: }); Nenue@16: end Nenue@16: -- money Nenue@16: Nenue@16: local money = GetQuestLogRewardMoney(questID) Nenue@16: if ( money > 0 ) then Nenue@16: tinsert(rewards, { Nenue@16: type = 'money', Nenue@16: name = GetMoneyString(money), Nenue@16: texture = "Interface\\Icons\\inv_misc_coin_01", Nenue@16: count = 0, Nenue@16: }); Nenue@16: end Nenue@16: Nenue@16: if #rewards >= 1 then Nenue@16: t.rewardInfo = rewards Nenue@16: end Nenue@16: Nenue@14: Bonus.TasksTable[questID] = t Nenue@14: Nenue@14: return t Nenue@14: end Nenue@14: Nenue@14: ----------------------------- Nenue@13: --- QUEST Nenue@1: Quest.itemButtons = {} Nenue@1: Quest.freeButtons = {} Nenue@1: Quest.POI = {} Nenue@5: Quest.QuestBlock = {} Nenue@16: Quest.LogBlock = {} Nenue@16: Quest.LogInfo = {} Nenue@18: Nenue@19: function Quest:GetNumWatched () Nenue@19: print(self.name, self) Nenue@19: self.numAll = GetNumQuestLogEntries() Nenue@19: self.numWatched = GetNumQuestWatches() Nenue@19: return self.numWatched, self.numAll Nenue@0: end Nenue@0: Quest.GetInfo = function (self, watchIndex) Nenue@0: print('|cFF00DDFFQuest|r.|cFF0088FFGetInfo(|r'.. tostring(watchIndex)..'|r)') Nenue@1: local questID, title, questIndex, numObjectives, requiredMoney, isComplete, Nenue@0: startEvent, isAutoComplete, failureTime, timeElapsed, questType, isTask, isStory, isOnMap, hasLocalPOI = GetQuestWatchInfo(watchIndex) Nenue@13: Nenue@19: if not questIndex then Nenue@19: return Nenue@19: end Nenue@19: Nenue@14: local _, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, _, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(questIndex) Nenue@18: Nenue@13: Nenue@0: if not questID then Nenue@0: return Nenue@0: end Nenue@16: Quest.Info[questID] = Quest.Info[questID] or {} Nenue@0: Nenue@16: local q = Quest.Info[questID] Nenue@0: q.watchIndex = watchIndex Nenue@0: q.type = 'Quest' Nenue@0: q.questID = questID Nenue@0: q.title = title Nenue@13: q.level = level Nenue@18: q.displayQuestID = displayQuestID Nenue@18: q.suggestedGroup = suggestedGroup Nenue@1: q.questLogIndex = questIndex Nenue@0: q.numObjectives = numObjectives Nenue@0: q.requiredMoney = requiredMoney Nenue@0: q.isComplete = isComplete Nenue@0: q.startEvent = startEvent Nenue@0: q.isAutoComplete = isAutoComplete Nenue@0: q.failureTime = failureTime Nenue@0: q.timeElapsed = timeElapsed Nenue@0: q.questType = questType Nenue@0: q.isTask = isTask Nenue@0: q.isStory = isStory Nenue@0: q.isOnMap = isOnMap Nenue@0: q.hasLocalPOI = hasLocalPOI Nenue@18: q.frequency = frequency Nenue@13: q.isComplete = isComplete Nenue@13: q.isStory = isStory Nenue@13: q.isTask = isTask Nenue@14: Nenue@18: --- resolve icon type and template Nenue@18: local tagID, tagName = GetQuestTagInfo(questID) Nenue@18: if ( tagName ) then Nenue@18: local factionGroup = GetQuestFactionGroup(questID); Nenue@18: -- Faction-specific account quests have additional info in the tooltip Nenue@18: if ( tagID == QUEST_TAG_ACCOUNT and factionGroup ) then Nenue@18: local factionString = FACTION_ALLIANCE; Nenue@18: if ( factionGroup == LE_QUEST_FACTION_HORDE ) then Nenue@18: factionString = FACTION_HORDE; Nenue@18: end Nenue@18: tagName = format("%s (%s)", tagName, factionString); Nenue@18: end Nenue@18: if ( QUEST_TAG_TCOORDS[tagID] ) then Nenue@18: local questTypeIcon; Nenue@18: if ( tagID == QUEST_TAG_ACCOUNT and factionGroup ) then Nenue@18: q.typeTag = QUEST_TAG_TCOORDS["ALLIANCE"]; Nenue@18: if ( factionGroup == LE_QUEST_FACTION_HORDE ) then Nenue@18: q.typeTag= QUEST_TAG_TCOORDS["HORDE"]; Nenue@18: end Nenue@18: else Nenue@18: q.typeTag = QUEST_TAG_TCOORDS[tagID]; Nenue@18: end Nenue@18: end Nenue@14: end Nenue@14: Nenue@18: if ( frequency == LE_QUEST_FREQUENCY_DAILY ) then Nenue@18: q.frequencyTag = QUEST_TAG_TCOORDS["DAILY"] Nenue@18: q.mainStyle = 'Daily' Nenue@18: elseif ( frequency == LE_QUEST_FREQUENCY_WEEKLY ) then Nenue@18: q.frequencyTag = QUEST_TAG_TCOORDS["WEEKLY"] Nenue@18: q.mainStyle = 'Daily' Nenue@18: end Nenue@18: if ( isComplete and isComplete < 0 ) then Nenue@18: q.completionTag = QUEST_TAG_TCOORDS["FAILED"] Nenue@18: q.subStyle = 'Failed' Nenue@18: elseif isComplete then Nenue@18: q.completionTag = QUEST_TAG_TCOORDS["COMPLETED"] Nenue@18: q.subStyle = 'Complete' Nenue@18: end Nenue@18: q.tagID = tagID Nenue@18: q.tagName = tagName Nenue@18: Nenue@18: Nenue@18: Nenue@13: --q.isBreadCrumb = isBreadCrumb Nenue@1: q.completionText= GetQuestLogCompletionText(questIndex) Nenue@1: q.numObjectives = GetNumQuestLeaderBoards(questIndex) Nenue@0: q.objectives = {} Nenue@0: for i = 1, q.numObjectives do Nenue@1: local text, type, finished = GetQuestLogLeaderBoard(i, questIndex) Nenue@0: q.objectives[i] = { Nenue@14: index = i, Nenue@0: type = type, Nenue@0: text = text, Nenue@0: finished = finished Nenue@0: } Nenue@0: if type == 'event' then Nenue@0: elseif type == 'monster' then Nenue@0: elseif type == 'object' then Nenue@0: elseif type == 'reputation' then Nenue@0: elseif type == 'item' then Nenue@0: end Nenue@0: end Nenue@0: Nenue@1: local link, icon, charges = GetQuestLogSpecialItemInfo(questIndex) Nenue@1: local start, duration, enable = GetQuestLogSpecialItemCooldown(questIndex) Nenue@0: if link or icon or charges then Nenue@0: q.specialItem = { Nenue@1: questID = questID, Nenue@1: questIndex = questIndex, Nenue@0: link = link, Nenue@0: charges = charges, Nenue@0: icon = icon, Nenue@0: start = start, Nenue@0: duration = duration, Nenue@0: enable = enable, Nenue@0: } Nenue@0: end Nenue@0: Nenue@1: if QuestHasPOIInfo(questID) then Nenue@1: local distance, onContinent = GetDistanceSqToQuest(questIndex) Nenue@1: if distance ~= nil and distance > 0 then Nenue@1: self.POI[questIndex] = { Nenue@1: questIndex = questIndex, Nenue@1: questID = questID, Nenue@1: distance = distance, Nenue@1: onContinent = onContinent Nenue@1: } Nenue@1: end Nenue@1: end Nenue@1: Nenue@18: Nenue@18: q.selected = (questID == GetSuperTrackedQuestID()) -- call directly so artifact data doesn't become an issue Nenue@8: self.WatchInfo[watchIndex] = q Nenue@1: self.LogInfo[questIndex] = q Nenue@2: print('- logIndex =', questIndex, 'title =', title) Nenue@0: return q Nenue@0: end Nenue@0: Nenue@1: Quest.GetClosest = function() Nenue@1: local minID Nenue@1: local minDist = math.huge Nenue@1: for i = 1, Quest.GetNumWatched() do Nenue@1: local info = Quest.GetInfo(i) Nenue@1: if info.hasLocalPOI then Nenue@1: local distance, onContinent = GetDistanceSqToQuest(info.questIndex) Nenue@1: end Nenue@1: end Nenue@1: end Nenue@1: Nenue@6: Nenue@0: Cheevs.GetNumWatched = function(self) Nenue@0: Cheevs.trackedCheevs = {GetTrackedAchievements()} Nenue@0: return GetNumTrackedAchievements() Nenue@0: end Nenue@0: Cheevs.GetInfo = function(self, index) Nenue@0: local cheevID = Cheevs.trackedCheevs[index] Nenue@0: local id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuildAch, wasEarnedByMe, earnedBy = GetAchievementInfo(cheevID) Nenue@0: Nenue@0: self.Info[cheevID] = {} Nenue@0: local c = self.Info[cheevID] Nenue@0: c.type = 'Cheevs' Nenue@0: c.watchIndex = index Nenue@0: c.cheevID = cheevID Nenue@0: c.title = name Nenue@0: c.points, c.completed, c.month, c.day, c.year, c.description, c.flags, c.icon, c.rewardText, c.isGuildAch, c.wasEarnedByMe, c.earnedBy = Nenue@0: points, completed, month, day, year, description, flags, icon, rewardText, isGuildAch, wasEarnedByMe, earnedBy Nenue@0: c.numObjectives = GetAchievementNumCriteria(cheevID) Nenue@0: c.objectives = {} Nenue@0: for i = 1, c.numObjectives do Nenue@0: local description, type, completed, quantity, requiredQuantity, characterName, flags, assetID, quantityString, criteriaID = GetAchievementCriteriaInfo(cheevID, i) Nenue@0: c.objectives[i] = { Nenue@14: index = i, Nenue@8: cheevID = cheevID, Nenue@0: text = description, Nenue@0: type = type, Nenue@0: finished = completed, Nenue@14: value = quantity, Nenue@14: maxValue = requiredQuantity, Nenue@0: characterName = characterName, Nenue@0: flags = flags, Nenue@0: assetID = assetID, Nenue@0: quantityString = quantityString, Nenue@0: criteriaID = criteriaID, Nenue@0: } Nenue@0: end Nenue@3: print('Cheevs.|cFF0088FFGetInfo|r('..index..')', 'obj:', GetAchievementNumCriteria(cheevID), name, description) Nenue@0: Nenue@0: self.WatchInfo[index] = c Nenue@0: return self.Info[cheevID] Nenue@0: end