Mercurial > wow > buffalo2
view ObjectiveTracker/BonusObjectives.lua @ 30:7583684becf4
- implement procedural block contents generation
- redo anchor calculations to allow for transitional animation
- attempt to sort out event handling quirks related to autopopup quest completion and turn-in
- revise the data structures created by the different GetInfo's
- start on trimming out redundant variables
author | Nenue |
---|---|
date | Thu, 14 Apr 2016 17:11:13 -0400 |
parents | adcd7c328d07 |
children | 48b3e3959a0a |
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 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 GetNumQuestLogRewardCurrencies, GetQuestLogRewardCurrencyInfo = GetNumQuestLogRewardCurrencies, GetQuestLogRewardCurrencyInfo local GetNumQuestLogRewards, GetQuestLogRewardInfo = GetNumQuestLogRewards, GetQuestLogRewardInfo local GetQuestLogRewardMoney, GetMoneyString = GetQuestLogRewardMoney, GetMoneyString local GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime = GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime local DoQuestRewards = function(t, questID) 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 end --- 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 () print(self.name, self) local tasks = InternalGetTasksTable() local numWatched = 0 local numAll = 0 self.WatchInfo = {} print('|cFFFFFF00Bonus.GetNumWatched()|r', #tasks) print(' TasksTable pull:') 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] self.WatchInfo[i] = t t.isInArea = isInArea t.isOnMap = isOnMap t.existingTask = existingTask t.questID = questID t.id = questID t.objectives = {} t.taskIndex = i DoQuestRewards(t, questID) local taskTitle 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.objectiveIndex = objectiveIndex o.text = text o.objectiveType = objectiveType o.finished = finished o.displayAsObjective = displayAsObjective print(' |cFF00FF88*', objectiveIndex, text) end -- 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.title = taskTitle 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, questID, xp, money) if #self.info.rewardInfo >= 1 then for i, reward in ipairs(self.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'..self.name..':OnTurnIn call', questID, xp, money) local savedTasks = B.Conf.TasksLog self.Info[questID].completedTime = GetTime() self.Info[questID].animate = true T.SetAnimate(self.watchReasonModule) savedTasks[questID] = self.Info[questID] 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) end Bonus.UpdateLine = function(handler, block, line, data) local info = block.info local print = lprint line.displayColor = 'FFFFFF' line.displayText = data.text line.progress = 0 print(' ', data.objectiveIndex,'|cFFFF0088-|r', data.objectiveType, data.text) if data.objectiveType == 'progressbar' then line.widgetType = 'ProgressBar' print(' |cFFFF44DDpercent='..tostring(GetQuestProgressBarPercent(info.questID))) data.value = GetQuestProgressBarPercent(info.questID) or 0 data.maxValue = 100 if data.value >= data.maxValue then line.progress = 1 elseif data.value > 0 then line.progress = 2 end line.format = PERCENTAGE_STRING local widget = T.SetWidget(line, data, 'ProgressBar', info.questID..'-'..data.objectiveIndex) print(' |cFFFF0022** text:|r', data.text, '|cFFFF0022value:|r', data.value, '|cFFFF0022max:|r', data.maxValue) widget:SetPoint('TOP', line, 'TOP', 0, 0) line.widget = widget line.height = widget.height else line.displayText = data.text line.widget = nil end return line end Bonus.Select = function(self) Bonus:OnTurnIn(self.info.questID) end Bonus.Remove = function(self) end