Mercurial > wow > buffalo2
view ObjectiveInfo.lua @ 19:605e8f0e46db
ObjectiveCore / Style / Events / Frame
- polishing the execution path for better performance
- make use of the Blizzard_ObjectiveTracker bitfield values to ensure compatibility in possible secure hooks
- avoid full updates when possible (using said bitfield values to indicate targeted sections)
- extreme streamlining of event handling layout: specific reason updates are invoked from API hooks; broader updates are invoked by when the event listener catches something vague like 'QUEST_LOG_UPDATE'
author | Nenue |
---|---|
date | Wed, 06 Apr 2016 07:38:35 -0400 |
parents | d1812fb10ae6 |
children | d5ee940de273 |
line wrap: on
line source
local B = select(2,...).frame local wipe, pairs, ipairs, min, max, unpack, format = table.wipe, pairs, ipairs, min, max, unpack, format local tinsert, tostring = tinsert, tostring local GetQuestTagInfo, GetQuestLogTitle = GetQuestTagInfo, GetQuestLogTitle local GetNumQuestLogEntries, GetNumQuestWatches, GetQuestLogCompletionText, IsQuestWatched, IsQuestHardWatched, GetQuestLogSpecialItemInfo, GetQuestLogSpecialItemCooldown = GetNumQuestLogEntries, GetNumQuestWatches, GetQuestLogCompletionText, IsQuestWatched, IsQuestHardWatched, GetQuestLogSpecialItemInfo, GetQuestLogSpecialItemCooldown local GetNumAutoQuestPopUps, GetAutoQuestPopUp, GetTasksTable, GetNumQuestLogTasks, GetTaskInfo, GetQuestObjectiveInfo = GetNumAutoQuestPopUps, GetAutoQuestPopUp, GetTasksTable, GetNumQuestLogTasks, GetTaskInfo, GetQuestObjectiveInfo local GetNumQuestLogRewardCurrencies, GetQuestLogRewardCurrencyInfo, GetNumQuestLogRewards, GetQuestLogRewardInfo, GetQuestLogRewardMoney, GetMoneyString = GetNumQuestLogRewardCurrencies, GetQuestLogRewardCurrencyInfo, GetNumQuestLogRewards, GetQuestLogRewardInfo, GetQuestLogRewardMoney, GetMoneyString local GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo = GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo local GetQuestWatchIndex, GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo = GetQuestWatchIndex, GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo local QuestHasPOIInfo, GetDistanceSqToQuest, GetQuestFactionGroup = QuestHasPOIInfo, GetDistanceSqToQuest, GetQuestFactionGroup local GetTrackedAchievements, GetNumTrackedAchievements, GetAchievementInfo = GetTrackedAchievements, GetNumTrackedAchievements, GetAchievementInfo local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') local print = B.print('TrackerInfo') local QUEST_TAG_DUNGEON = QUEST_TAG_DUNGEON local QUEST_TAG_GROUP = QUEST_TAG_GROUP local QUEST_TAG_ACCOUNT = QUEST_TAG_ACCOUNT local QUEST_TAG_TCOORDS = QUEST_TAG_TCOORDS local LE_QUEST_FREQUENCY_DAILY = LE_QUEST_FREQUENCY_DAILY local LE_QUEST_FREQUENCY_WEEKLY = LE_QUEST_FREQUENCY_WEEKLY 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 local Tracker, Bonus, AutoQuest, Quest, Cheevs = mod.DefaultTracker, mod.Bonus, mod.AutoQuest, mod.Quest, mod.Cheevs -------------------------------------------------------------------- --- Tracker-specific data retrieval functions -------------------------------------------------------------------- ----------------------------- --- AUTO_QUEST AutoQuest.LogInfo = {} AutoQuest.LogBlock = {} AutoQuest.QuestBlock = {} AutoQuest.WatchBlock = {} function AutoQuest:GetNumWatched () print(self.name, self) self.numWatched = GetNumAutoQuestPopUps() return self.numWatched end AutoQuest.GetInfo = function(self, popupIndex) local questID, type = GetAutoQuestPopUp(popupIndex) local questIndex = GetQuestLogIndexByID(questID) local questWatchIndex = GetQuestWatchIndex(questIndex) local questInfo = Quest:GetInfo(questWatchIndex) self.Info[questID] = { title = questInfo.title, description = type, popupType = type, questID = questID, questIndex = questIndex, popupIndex = popupIndex, watchIndex = questWatchIndex, numObjectives = 0 } return self.Info[questID] end ----------------------------- --- BONUS OBJECTIVE Bonus.TasksTable = {} Bonus.TasksPOI = {} Bonus.TaskScenario = {} local taskData = {} Bonus.QuestBlock = {} Bonus.TaskWatch = {} function Bonus:GetNumWatched () print(self.name, self) local tasks = GetTasksTable() local numTasks = 0 Bonus.TaskWatch = {} print('|cFFFFFF00Bonus.GetNumWatched()|r', #tasks) for i, questID in ipairs(tasks) do local t = Bonus.StoreTask(questID) print (' taskIndex', i, 'questID', questID) print(' isComplete', t.isComplete) if (t.inInArea or t.isOnMap) and not t.isComplete then numTasks = numTasks + 1 Bonus.TaskWatch[numTasks] = t end end Bonus.numAll = #Bonus.TasksTable Bonus.numWatched = numTasks return GetNumQuestLogTasks() end Bonus.GetInfo = function(self, taskIndex) print(self.name, self) return Bonus.TaskWatch[taskIndex] end Bonus.StoreTask = function(questID) if not questID then print('|cFFFF4400invalid quest ID', questID) return end Bonus.Info[questID] = Bonus.Info[questID] or {} local t = Bonus.Info[questID] local isInArea, isOnMap, numObjectives = GetTaskInfo(questID) t.questID = questID t.numObjectives = numObjectives t.isInArea = isInArea t.isOnMap = isOnMap print(' isInArea', isInArea, 'isOnMap', isOnMap, 'numObj', numObjectives) local displayObjectives = false local isComplete = true if numObjectives >= 1 then print(' ', numObjectives,'objective rows') t.objectives = {} for i = 1, t.numObjectives do t.objectives[i] = {} local o = t.objectives[i] o.index = i --local text, objectiveType, finished, displayAsObjective = o.text, o.objectiveType, o.finished, o.displayAsObjective = GetQuestObjectiveInfo(questID, i, false) print(i, '==>', o.text, o.objectiveType, o.finished, o.displayAsObjective) t.displayObjectives = t.displayObjectives or o.displayAsObjective t.isComplete = t.isComplete and o.finished end end t.displayObjectives = displayObjectives local rewards = {} t.numCurrencies = GetNumQuestLogRewardCurrencies(questID) for i = 1, t.numCurrencies do local name, texture, count = GetQuestLogRewardCurrencyInfo(i, questID) tinsert(rewards,{ type = 'currency', index = i, name = name, texture = texture, count = count }); end -- items t.numItems = GetNumQuestLogRewards(questID) for i = 1, t.numItems do local name, texture, count, quality, isUsable = GetQuestLogRewardInfo(i, questID) tinsert(rewards, { type = 'item', index = i , name = name, texture = texture, count = count, quality = quality, isUsable = isUsable }); end -- money local money = GetQuestLogRewardMoney(questID) if ( money > 0 ) then tinsert(rewards, { type = 'money', name = GetMoneyString(money), texture = "Interface\\Icons\\inv_misc_coin_01", count = 0, }); end if #rewards >= 1 then t.rewardInfo = rewards end Bonus.TasksTable[questID] = t return t end ----------------------------- --- QUEST Quest.itemButtons = {} Quest.freeButtons = {} Quest.POI = {} Quest.QuestBlock = {} Quest.LogBlock = {} Quest.LogInfo = {} function Quest:GetNumWatched () print(self.name, self) self.numAll = GetNumQuestLogEntries() self.numWatched = GetNumQuestWatches() return self.numWatched, self.numAll end Quest.GetInfo = function (self, watchIndex) print('|cFF00DDFFQuest|r.|cFF0088FFGetInfo(|r'.. tostring(watchIndex)..'|r)') local questID, title, questIndex, numObjectives, requiredMoney, isComplete, startEvent, isAutoComplete, failureTime, timeElapsed, questType, isTask, isStory, isOnMap, hasLocalPOI = GetQuestWatchInfo(watchIndex) if not questIndex then return end local _, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, _, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(questIndex) if not questID then return end Quest.Info[questID] = Quest.Info[questID] or {} local q = Quest.Info[questID] q.watchIndex = watchIndex q.type = 'Quest' q.questID = questID q.title = title q.level = level q.displayQuestID = displayQuestID q.suggestedGroup = suggestedGroup q.questLogIndex = questIndex q.numObjectives = numObjectives q.requiredMoney = requiredMoney q.isComplete = isComplete q.startEvent = startEvent q.isAutoComplete = isAutoComplete q.failureTime = failureTime q.timeElapsed = timeElapsed q.questType = questType q.isTask = isTask q.isStory = isStory q.isOnMap = isOnMap q.hasLocalPOI = hasLocalPOI q.frequency = frequency q.isComplete = isComplete q.isStory = isStory q.isTask = isTask --- resolve icon type and template local tagID, tagName = GetQuestTagInfo(questID) if ( tagName ) then local factionGroup = GetQuestFactionGroup(questID); -- Faction-specific account quests have additional info in the tooltip if ( tagID == QUEST_TAG_ACCOUNT and factionGroup ) then local factionString = FACTION_ALLIANCE; if ( factionGroup == LE_QUEST_FACTION_HORDE ) then factionString = FACTION_HORDE; end tagName = format("%s (%s)", tagName, factionString); end if ( QUEST_TAG_TCOORDS[tagID] ) then local questTypeIcon; if ( tagID == QUEST_TAG_ACCOUNT and factionGroup ) then q.typeTag = QUEST_TAG_TCOORDS["ALLIANCE"]; if ( factionGroup == LE_QUEST_FACTION_HORDE ) then q.typeTag= QUEST_TAG_TCOORDS["HORDE"]; end else q.typeTag = QUEST_TAG_TCOORDS[tagID]; end end end if ( frequency == LE_QUEST_FREQUENCY_DAILY ) then q.frequencyTag = QUEST_TAG_TCOORDS["DAILY"] q.mainStyle = 'Daily' elseif ( frequency == LE_QUEST_FREQUENCY_WEEKLY ) then q.frequencyTag = QUEST_TAG_TCOORDS["WEEKLY"] q.mainStyle = 'Daily' end if ( isComplete and isComplete < 0 ) then q.completionTag = QUEST_TAG_TCOORDS["FAILED"] q.subStyle = 'Failed' elseif isComplete then q.completionTag = QUEST_TAG_TCOORDS["COMPLETED"] q.subStyle = 'Complete' end q.tagID = tagID q.tagName = tagName --q.isBreadCrumb = isBreadCrumb q.completionText= GetQuestLogCompletionText(questIndex) q.numObjectives = GetNumQuestLeaderBoards(questIndex) q.objectives = {} for i = 1, q.numObjectives do local text, type, finished = GetQuestLogLeaderBoard(i, questIndex) q.objectives[i] = { index = i, type = type, text = text, finished = finished } if type == 'event' then elseif type == 'monster' then elseif type == 'object' then elseif type == 'reputation' then elseif type == 'item' then end end local link, icon, charges = GetQuestLogSpecialItemInfo(questIndex) local start, duration, enable = GetQuestLogSpecialItemCooldown(questIndex) if link or icon or charges then q.specialItem = { questID = questID, questIndex = questIndex, link = link, charges = charges, icon = icon, start = start, duration = duration, enable = enable, } end if QuestHasPOIInfo(questID) then local distance, onContinent = GetDistanceSqToQuest(questIndex) if distance ~= nil and distance > 0 then self.POI[questIndex] = { questIndex = questIndex, questID = questID, distance = distance, onContinent = onContinent } end end q.selected = (questID == GetSuperTrackedQuestID()) -- call directly so artifact data doesn't become an issue self.WatchInfo[watchIndex] = q self.LogInfo[questIndex] = q print('- logIndex =', questIndex, 'title =', title) return q end Quest.GetClosest = function() local minID local minDist = math.huge for i = 1, Quest.GetNumWatched() do local info = Quest.GetInfo(i) if info.hasLocalPOI then local distance, onContinent = GetDistanceSqToQuest(info.questIndex) end end end Cheevs.GetNumWatched = function(self) Cheevs.trackedCheevs = {GetTrackedAchievements()} return GetNumTrackedAchievements() end Cheevs.GetInfo = function(self, index) local cheevID = Cheevs.trackedCheevs[index] local id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuildAch, wasEarnedByMe, earnedBy = GetAchievementInfo(cheevID) self.Info[cheevID] = {} local c = self.Info[cheevID] c.type = 'Cheevs' c.watchIndex = index c.cheevID = cheevID c.title = name c.points, c.completed, c.month, c.day, c.year, c.description, c.flags, c.icon, c.rewardText, c.isGuildAch, c.wasEarnedByMe, c.earnedBy = points, completed, month, day, year, description, flags, icon, rewardText, isGuildAch, wasEarnedByMe, earnedBy c.numObjectives = GetAchievementNumCriteria(cheevID) c.objectives = {} for i = 1, c.numObjectives do local description, type, completed, quantity, requiredQuantity, characterName, flags, assetID, quantityString, criteriaID = GetAchievementCriteriaInfo(cheevID, i) c.objectives[i] = { index = i, cheevID = cheevID, text = description, type = type, finished = completed, value = quantity, maxValue = requiredQuantity, characterName = characterName, flags = flags, assetID = assetID, quantityString = quantityString, criteriaID = criteriaID, } end print('Cheevs.|cFF0088FFGetInfo|r('..index..')', 'obj:', GetAchievementNumCriteria(cheevID), name, description) self.WatchInfo[index] = c return self.Info[cheevID] end