Mercurial > wow > buffalo2
diff ObjectiveTracker/QuestTracker.lua @ 23:e837384ac363
Separating objective tracker module
author | Nenue |
---|---|
date | Sun, 10 Apr 2016 04:35:32 -0400 |
parents | |
children | 66b927b46776 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ObjectiveTracker/QuestTracker.lua Sun Apr 10 04:35:32 2016 -0400 @@ -0,0 +1,307 @@ +local B = select(2,...).frame +local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') +local _G, ipairs, max, min, unpack, floor, pairs, tostring, type, band = _G, ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band +local GetAutoQuestPopUp, GetQuestLogCompletionText = GetAutoQuestPopUp, GetQuestLogCompletionText +local Default, Quest = T.DefaultHandler, T.Quest +local format = format +local print = B.print('Tracker') +local lprint = B.print('Line') + +local colors = T.colors +Quest.UpdateObjectives = function(handler, block) + local print = lprint + print('|cFF00FFFFUpdateObjectives()') + local info = block.info + + local titlebg, textbg = colors.default.titlebg, colors.default.textbg + print((info.isAccount and 'isAccount' or ''), (info.isFaction and 'isFaction' or ''), (info.isDaily and 'isDaily' or ''), (info.isWeekly and 'isWeekly' or ''), info.tagID, info.tagName) + + if info.isAccount then + if info.isFaction then + print(' faction', info.tagID) + titlebg, textbg = colors['faction_'..info.tagID].titlebg, colors.default.textbg + else + print(' account', info.isAccount, info.isFaction) + titlebg, textbg = colors.account.titlebg, colors.account.textbg + end + elseif info.isDaily then + print(' daily', info.frequency) + titlebg, textbg = colors.daily.titlebg, colors.daily.textbg + elseif info.isWeekly then + print(' weekly', info.frequency) + titlebg, textbg = colors.weekly.titlebg, colors.weekly.textbg + end + + block.titlebg:SetGradientAlpha(unpack(titlebg)) + block.statusbg:SetGradientAlpha(unpack(textbg)) + + local completionText + if info.isAutoComplete then + local questID, popupType = GetAutoQuestPopUp(info.questLogIndex) + if popupType == 'COMPLETE' then + print(' :: auto-complete quest :: set the message') + info.completionText = CLICK_TO_COMPLETE + end + end + if info.isComplete then + if not completionText or info.completionText then + info.completionText = GetQuestLogCompletionText(info.questLogIndex) + end + print(' :: complete quest :: show instruction: "'.. tostring(info.completionText) .. '"') + end + + Default.UpdateObjectives(handler, block) +end + +Quest.UpdateLine = function(handler, block, line, data) + local print = lprint + local objectiveType = data.type + local r, g, b, a = 0, 1, 1, 1 + + line.progress = 0 + if data.finished then + line.progress = 2 + r, g, b, a = 0, 1, 0, 1 + elseif objectiveType == 'monster' then + r, g, b, a = 1, .55, .2, 1 + elseif objectiveType == 'item' then + r, g, b, a = .8, .8, .8, 1 + elseif objectiveType == 'object' then + r, g, b, a = 1, 1, 1, 1 + elseif objectiveType == 'player' then + r, g, b, a = 0, 0.8, 1, 1 + end + print(format(' |cFF%02X%02X%02X%0.1f, %0.1f, %0.1f|r', (r * 255), g * 255, b * 255, r, g, b)) + + line.displayColor = {r, g, b, a} + line.status:SetTextColor(r, g, b, a) + line.displayText = data.text + + return line +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 questTagID, tagName = GetQuestTagInfo(questID) + local tagID + + local factionGroup = GetQuestFactionGroup(questID); + if( questTagID and questTagID == QUEST_TAG_ACCOUNT ) then + if( factionGroup ) then + tagID = "ALLIANCE"; + if ( factionGroup == LE_QUEST_FACTION_HORDE ) then + tagID = "HORDE"; + end + q.isFaction = true + else + tagID = QUEST_TAG_ACCOUNT; + q.isAccount = true + end + q.typeTag = QUEST_TAG_TCOORDS[tagID] + elseif ( factionGroup) then + tagID = "ALLIANCE"; + if ( factionGroup == LE_QUEST_FACTION_HORDE ) then + tagID = "HORDE"; + end + q.isFaction = true + end + + if( frequency == LE_QUEST_FREQUENCY_DAILY and (not isComplete or isComplete == 0) ) then + tagID = "DAILY"; + q.frequencyTag = QUEST_TAG_TCOORDS["DAILY"] + q.isDaily = true + elseif( frequency == LE_QUEST_FREQUENCY_WEEKLY and (not isComplete or isComplete == 0) )then + tagID = "WEEKLY"; + q.frequencyTag = QUEST_TAG_TCOORDS["WEEKLY"] + q.isWeekly = true + elseif( questTagID ) then + tagID = questTagID; + end + + if ( isComplete and isComplete < 0 ) then + q.completionTag = QUEST_TAG_TCOORDS["FAILED"] + q.isFailed = true + elseif isComplete then + q.completionTag = QUEST_TAG_TCOORDS["COMPLETED"] + end + + + q.tagID = questTagID + 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) + print(format(' #%d %s %s %s', i, tostring(type), tostring(text), tostring(finished))) + 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 + + if requiredMoney >= 1 then + local money = GetMoney() + local moneyText = money + local requiredSilver, requiredCopper + local requiredGold = (requiredMoney > 10000) and (floor(requiredMoney/10000)) or nil + if mod(requiredMoney, 10000) ~= 0 then + requiredSilver = (requiredMoney > 100) and (mod(requiredMoney, 10000) / 100) or nil + if mod(requiredMoney, 100) ~= 0 then + requiredCopper = mod(requiredMoney, 100) + end + end + + -- round the money value down + if requiredMoney > 9999 and not (requiredSilver or requiredCopper) then + moneyText = floor(money/10000) + elseif requiredMoney < 10000 and mod(requiredMoney,100) == 0 then + moneyText = floor(money/100) + end + + local text = moneyText + local index = #q.objectives + 1 + local finished = (GetMoney() >= requiredMoney) + + if not finished then + text = text .. ' / ' .. GetCoinTextureString(requiredMoney, 12) + else + text = '' .. GetCoinTextureString(requiredMoney, 12) + end + q.objectives[index] = { + index = index, + type = 'progressbar', + quantity = money, + requiredQuantity = requiredMoney, + text = text, + finished = finished + } + print(format(' #%d %s %s %s', index, 'money', text, tostring(finished))) + 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, minTitle + local minDist = math.huge + local numQuests = GetNumQuestLogEntries() + for questIndex = 1, numQuests do + local distance, onContinent = GetDistanceSqToQuest(questIndex) + local title, level, _, _, _, _, _, _, questID = GetQuestLogTitle(questIndex) + if onContinent and distance < minDist then + minDist = distance + minTitle = title + minID = questID + end + end + + print('nearest quest is', minTitle, 'by', math.sqrt(minDist)) + return minID, minTitle, minDist +end + +Quest.OnTurnIn = function(self, questID, xp, money) + +end \ No newline at end of file