view ObjectiveInfo.lua @ 7:5301c68f28d8

TrackerBlock - use IsModifiedClick function to determine appropriate OnClick actions - handle 'CHATLINK' modifier - handle 'TOGGLEQUESTWATCH' modifier TrackerBlockObjectives - use a generic framework to manage frame creation for various criteria tracker types: - ProgressBar when Blizzard flag data indicates so - skip when Blizzard flag data indicates so - DynamicText otherwise - events related to the criteria are registered in the criteria frame, and unregistered when the frame is hidden, either by destruction of its parent or completion
author Nenue
date Fri, 01 Apr 2016 12:27:05 -0400
parents 589de8ea05b9
children 7923243ae972
line wrap: on
line source
local B = select(2,...).frame
local wipe, pairs, ipairs, min, max, unpack = table.wipe, pairs, ipairs, min, max, unpack
local GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo = GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo
local GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo = GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo
local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
local print = B.print('Objectives')

local Tracker, AutoQuest, Quest, Cheevs = mod.Tracker, mod.AutoQuest, mod.Quest, mod.Cheevs
--------------------------------------------------------------------
--- Tracker-specific data retrieval functions
--------------------------------------------------------------------
Quest.itemButtons = {}
Quest.freeButtons = {}
Quest.POI = {}
Quest.QuestBlock = {}
Quest.GetNumWatched = function()
  return GetNumQuestWatches ()
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 questID then
    return
  end
  self.Info[questID] = self.Info[questID] or {}

  local q = self.Info[questID]
  q.watchIndex = watchIndex
  q.type = 'Quest'
  q.questID = questID
  q.title = title
  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

  --- Start QuestLogEntry calls
  -----------------------------------------
  SelectQuestLogEntry(questIndex)
  q.greenRange = GetQuestGreenRange()
  q.isDaily = QuestIsDaily()
  q.isWeekly = QuestIsWeekly()
  -----------------------------------------
  --- End QuestLogEntry calls

  q.isComplete = IsQuestComplete(questID)
  q.isBreadCrumb = IsBreadcrumbQuest(questID)
  q.isStoryQuest = IsStoryQuest(questID)
  q.completionText= GetQuestLogCompletionText(questIndex)
  q.trackingID = questID
  q.superTracked =  (questID == GetSuperTrackedQuestID()) -- call directly so artifact data doesn't become an issue
  q.numObjectives = GetNumQuestLeaderBoards(questIndex)
  q.isWatched = IsQuestWatched(questIndex)
  q.objectives = {}
  for i = 1, q.numObjectives do
    local text, type, finished = GetQuestLogLeaderBoard(i, questIndex)
    q.objectives[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

  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

AutoQuest.GetInfo = function(watchIndex)
  return Quest.GetInfo(watchIndex)
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] = {
      text = description,
      type = type,
      finished = completed,
      quantity = quantity,
      requiredQuantity = 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