Mercurial > wow > buffalo2
view ObjectiveTracker/BonusObjectives.lua @ 35:69d03f8e293e
- separated layout and data logic between Frame.lua and Update.lua
- solved disappearing tracker mystery
author | Nenue |
---|---|
date | Sun, 17 Apr 2016 11:07:48 -0400 |
parents | 9856ebc63fa4 |
children | a487841050be |
line wrap: on
line source
--- ${PACKAGE_NAME} -- @file-author@ -- @project-revision@ @project-hash@ -- @file-revision@ @file-hash@ -- Created: 4/13/2016 7:48 PM local B = select(2,...).frame local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') local Default, Quest = T.DefaultHandler, T.Quest local print = B.print('Tracker') local lprint = B.print('Line') local iprint = B.print('Info') local Bonus = T.Bonus local UnitName, GetRealmName, GetQuestObjectiveInfo, GetTasksTable, GetTaskInfo = UnitName, GetRealmName, GetQuestObjectiveInfo, GetTasksTable, GetTaskInfo local GetMapNameByID, GetCurrentMapAreaID = GetMapNameByID, GetCurrentMapAreaID local tinsert, ipairs, pairs, tostring = tinsert, ipairs, pairs, tostring local GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime = GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime local STICKY_TASKS = true --- Returns a tasks table modified to include recently completed objectives local InternalGetTasksTable = function() local savedTasks = T.Conf.TasksLog local char = UnitName("player") local realm = GetRealmName() local tasks = GetTasksTable() for questID, data in pairs(Bonus.Info) do print(' -- questID:', questID, #data.objectives) for i, o in ipairs(data.objectives) do print(' --', i, o.text) end end for questID, data in pairs(savedTasks) do if questID > 0 then local found = false for i = 1, #tasks do if tasks[i] == questID then found = true break end end -- if it's not part of the current table, then try to insert it where it was last found if not found then if data.watchIndex < #tasks then tinsert(tasks, data.watchIndex, data) else tinsert(tasks, data) end end end end return tasks end --- Returns an entry from the composed tasks table if possible, otherwise makes an API pull local InternalGetTaskInfo = function(questID) local completedTasks = T.Conf.TasksLog if completedTasks[questID] then return true, true, #completedTasks[questID].objectives else return GetTaskInfo(questID) end end --- Same as above but for the objective entries local InternalGetQuestObjectiveInfo = function(questID, objectiveIndex) local completedTasks = T.Conf.TasksLog if ( completedTasks[questID] ) then print('using internal data') return completedTasks[questID].objectives[objectiveIndex], completedTasks[questID].objectiveType, true; else return GetQuestObjectiveInfo(questID, objectiveIndex, false); end end --- end redundant copy of silliness ------------------------------------------------------------------------------------------ Bonus.Completed = {} Bonus.POI = {} Bonus.Scenario = {} Bonus.QuestBlock = {} Bonus.WatchInfo = {} function Bonus:GetNumWatched () local print = iprint print(self.name, self) local tasks = InternalGetTasksTable() local numWatched = 0 local numAll = 0 local existingTasks = {} self.WatchInfo = {} print('|cFFFFFF00Bonus.GetNumWatched()|r', #tasks) print(' |cFF00FFFFInternalGetTaskInfo|r:') for i, questID in ipairs(tasks) do local isInArea, isOnMap, numObjectives = InternalGetTaskInfo(questID) local existingTask = self.QuestBlock[questID] local displayObjectiveHeader = false; local test = (isInArea or (isOnMap and existingTask)) --local test = true if test then self.Info[questID] = self.Info[questID] or {} local t = self.Info[questID] if (isOnMap or isInArea) and existingTask then t.areaID = GetCurrentMapAreaID() local _ t.mapName, _, _, t.isMicroDungeon, t.microDungeonMapName = GetMapInfo() print('|cFF00FF00scooping map info (questID '..questID..'):|r', t.areaID, t.mapName) end local taskTitle t.objectives = {} local taskFinished = true; for objectiveIndex = 1, numObjectives do local text, objectiveType, finished, displayAsObjective = InternalGetQuestObjectiveInfo(questID, objectiveIndex, false); displayObjectiveHeader = displayObjectiveHeader or displayAsObjective; if not taskTitle then if objectiveType == 'progressbar' and not text:match('^%d%+\\%d+') then taskTitle = text text = '' end end print(' --', text, objectiveType, finished, displayAsObjective) t.objectives[objectiveIndex] = t.objectives[objectiveIndex] or {} local o = t.objectives[objectiveIndex] o.index = objectiveIndex o.text = text o.type = objectiveType o.finished = finished o.displayAsObjective = displayAsObjective end T.SetRewards(t, questID) -- didn't get a name from progress bar? what about area name if not taskTitle then if isInArea then taskTitle = GetMapNameByID(GetCurrentMapAreaID()) end end t.numObjectives = numObjectives t.isInArea = isInArea t.isOnMap = isOnMap t.existingTask = existingTask t.questID = questID t.id = questID t.taskIndex = i t.title = taskTitle self.WatchInfo[i] = t end print (' |cFF00FF88#', i, 'questID', questID, 'inArea', isInArea, 'onMap', isOnMap, 'existing', (existingTask and 'Y' or 'N'), (test and '|cFF00FF00show|r' or '|cFFFF0088hide|r')) end self.numAll = #tasks self.numWatched = #self.WatchInfo print(' stats:', self.numAll, 'active tasks,', self.numWatched, 'nearby or animating') --return #tasks return #self.WatchInfo end --- info cleanup done when turn-ins are detected Bonus.OnTurnIn = function(self, block, questID, xp, money) local info = self.Info[questID] if info.rewardInfo and #info.rewardInfo >= 1 then for i, reward in ipairs(info.rewardInfo) do --[[ type = 'item', index = i , name = name, texture = texture, count = count, quality = quality, isUsable = isUsable ]] print(' reward ', i, ' ', reward.type, reward.name, reward.count) end end print('|cFFFF8800'..block:GetName()..':OnTurnIn call', questID, xp, money) local savedTasks = B.Conf.TasksLog or {} info.completedTime = GetTime() info.animate = true T.SetAnimate(self.updateReasonModule) savedTasks[questID] = { id = questID, title = info.title, finished = true, numObjectives = info.numObjectives, objectives = info.objectives, rewardInfo = info.rewardInfo, } B.Conf.TasksLog = savedTasks print(' ## CONF TASKLOG ##') for i, t in pairs(savedTasks[questID]) do print(' |cFFFFFF00'.. tostring(i)..'|r', t) end for o, j in ipairs(savedTasks[questID].objectives) do print(' |cFF00FFFF#'.. o ..'|r', j.type, j.finished) end print('adding', info.title, 'to cache') end Bonus.GetInfo = function(self, taskIndex) print(self.name, self) return self.WatchInfo[taskIndex] end --- Update hooks Bonus.UpdateObjectives = function(handler, block) Default.UpdateObjectives(handler, block) return 'default' end Bonus.UpdateLine = function(handler, block, line, data) local info = block.info local print = lprint local text, attachment = '', nil line.displayColor = 'FFFFFF' if data.type == 'progressbar' then print(' |cFFFF44DDpercent='..tostring(GetQuestProgressBarPercent(info.questID))) local percent = 100 attachment = T.SetWidget(line, data, 'ProgressBar', info.questID..'-'..data.index) if not data.finished then percent = GetQuestProgressBarPercent(info.questID) end data.value = percent data.maxValue = 100 print(attachment:GetNumPoints()) for i = 1, attachment:GetNumPoints() do print(' ',attachment:GetPoint(i)) end attachment.value = percent attachment.maxValue = 100 attachment:SetPoint('TOP', line, 'TOP', 0, 0) attachment.status:SetFormattedText(PERCENTAGE_STRING, percent) print(attachment.status:GetText()) print(' |cFFFF0022** text:|r', data.text, '|cFFFF0022value:|r', data.value, '|cFFFF0022max:|r', data.maxValue) end text = data.text return text, attachment end Bonus.Select = function(handler, block) print(handler, block) handler:OnTurnIn(block, block.info.questID) end Bonus.Remove = function(self) end