Mercurial > wow > buffalo2
view ObjectiveTracker/BonusObjectives.lua @ 37:e84d645c8ab8
- revised the tracker update function to build its complete data list up front and use the values as points of comparison for determining possible out of place blocks, which will be iterated over afterward to remove what wasn't re-used
- also entailed revising the exact role of global event handlers and function hooks, limiting their directions of communication so one doesn't end up calling the other multiple or inifinity times
- schema handling polish
author | Nenue |
---|---|
date | Mon, 18 Apr 2016 07:56:23 -0400 |
parents | a487841050be |
children | 1f8f9cc3d956 |
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 () if true then return 0, 0, nil end 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 for i = 1, #self.usedBlocks do self.usedBlocks[i]:Hide() 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) attachment:SetParent(handler.frame) 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