Mercurial > wow > buffalo2
view ObjectiveTracker/BonusObjectives.lua @ 39:92534dc793f2
- restore the previous QuestLogSelection after pulling for selection-restricted quest data; fixes icon mixups while quest map is open
- moved progressbar builders into the schema environment, with all the other Frame.lua functions; prep for configuration access
- relegate the various removal events to a framescript in their corresponding blocks; this takes care of resolving dead frames
author | Nenue |
---|---|
date | Thu, 21 Apr 2016 16:43:37 -0400 |
parents | 1f8f9cc3d956 |
children | 03ed70f846de |
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, wipe = tinsert, ipairs, pairs, tostring, table.wipe local GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime = GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime local TASK_DISPLAY_TEST = 1 -- 1: normal (is nearby or on the map) 2: strict (is nearby) 3: data exists --- Returns a tasks table modified to include recently completed objectives local InternalGetTasksTable = function() local print = Bonus.print local savedTasks = T.Conf.TasksLog local char = UnitName("player") local realm = GetRealmName() local tasks = GetTasksTable() for questID, data in pairs(Bonus.Info) do print('GetTasksTable', questID, #data.objectives) for i, o in ipairs(data.objectives) do print('GetTasksTable', questID, 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 = {} local function CanShowTask(isInArea, isOnMap, existingTask, numObjectives) if TASK_DISPLAY_TEST == 1 then return (isInArea) elseif TASK_DISPLAY_TEST == 2 then return (isInArea and(isOnMap and existingTask)) elseif TASK_DISPLAY_TEST == 3 then return true end end function Bonus:GetNumWatched () local print = self.print print(self.name, self) local tasks = InternalGetTasksTable() local numWatched = 0 local numAll = 0 local existingTasks = {} wipe(self.WatchList) print('|cFF'..self.internalColor..'Bonus.GetNumWatched()|r', #tasks) print('InternalGetTaskInfo') for i, questID in ipairs(tasks) do local isInArea, isOnMap, numObjectives = InternalGetTaskInfo(questID) local existingTask = self.InfoBlock[questID] local displayObjectiveHeader = false; if CanShowTask(isInArea, isOnMap, existingTask) then print('TaskInfo', '|cFF00FF00showable objective list', questID) 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('InternalGetTaskInfo', 'map data', t.areaID, t.mapName) end local taskTitle t.id = questID 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('TaskObjective', 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.WatchList[i] = t elseif existingTask then print('TaskInfo', '|cFFFF4400hideable task', questID) existingTask:Hide() end print ('TaskInfo', i, 'questID', questID, 'inArea', isInArea, 'onMap', isOnMap, 'existing', (existingTask and 'Y' or 'N'), (test and '|cFF00FF00show|r' or '|cFFFF0088hide|r')) end self.numWatched = #self.WatchList self.numAll = #existingTasks return self.numWatched, self.numWatched, self.WatchList 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, blockSchema) block.schema = blockSchema or 'default' local info = block.info block.title:SetText(info.title) Default.UpdateObjectives(handler, block) return blockSchema end Bonus.UpdateLine = function(handler, block, data) local info = block.info local print = lprint local text, attachment = '', nil if data.type == 'progressbar' then print(' |cFFFF44DDpercent='..tostring(GetQuestProgressBarPercent(info.questID))) local percent = 100 attachment = T.GetWidget(data, 'StatusBar', info.questID..'-'..data.index) attachment:SetParent(block) 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.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, 'default' end Bonus.Select = function(handler, block) print(handler, block) handler:OnTurnIn(block, block.info.questID) end Bonus.Remove = function(self) end