comparison ObjectiveTracker/BonusObjectives.lua @ 40:03ed70f846de

- move block accessors into a new file - define a tMove function for reconciling the free/used tables as needed - when retrieving an old block frame, confirm ID still matches; resolves multiple watch items on one block - stop any animations when a block is freed; resolves stuck flare graphics
author Nenue
date Sun, 24 Apr 2016 14:15:25 -0400
parents 1f8f9cc3d956
children
comparison
equal deleted inserted replaced
39:92534dc793f2 40:03ed70f846de
15 local GetMapNameByID, GetCurrentMapAreaID = GetMapNameByID, GetCurrentMapAreaID 15 local GetMapNameByID, GetCurrentMapAreaID = GetMapNameByID, GetCurrentMapAreaID
16 local tinsert, ipairs, pairs, tostring, wipe = tinsert, ipairs, pairs, tostring, table.wipe 16 local tinsert, ipairs, pairs, tostring, wipe = tinsert, ipairs, pairs, tostring, table.wipe
17 local GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime = GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime 17 local GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime = GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime
18 local TASK_DISPLAY_TEST = 1 -- 1: normal (is nearby or on the map) 2: strict (is nearby) 3: data exists 18 local TASK_DISPLAY_TEST = 1 -- 1: normal (is nearby or on the map) 2: strict (is nearby) 3: data exists
19 19
20 --- Holds data for recently completed tasks
21 local completedTasks = {}
22
20 --- Returns a tasks table modified to include recently completed objectives 23 --- Returns a tasks table modified to include recently completed objectives
21 local InternalGetTasksTable = function() 24 local InternalGetTasksTable = function()
22 local print = Bonus.print 25 local print = Bonus.print
23 local savedTasks = T.Conf.TasksLog
24 local char = UnitName("player") 26 local char = UnitName("player")
25 local realm = GetRealmName() 27 local realm = GetRealmName()
26 local tasks = GetTasksTable() 28 local tasks = GetTasksTable()
27 29
28 for questID, data in pairs(Bonus.Info) do 30 for questID, data in pairs(Bonus.Info) do
30 for i, o in ipairs(data.objectives) do 32 for i, o in ipairs(data.objectives) do
31 print('GetTasksTable', questID, i, o.text) 33 print('GetTasksTable', questID, i, o.text)
32 end 34 end
33 end 35 end
34 36
35 for questID, data in pairs(savedTasks) do 37 for questID, data in pairs(completedTasks) do
36 if questID > 0 then 38 if questID > 0 then
37 local found = false 39 local found = false
38 for i = 1, #tasks do 40 for i = 1, #tasks do
39 if tasks[i] == questID then 41 if tasks[i] == questID then
40 found = true 42 found = true
53 end 55 end
54 return tasks 56 return tasks
55 end 57 end
56 58
57 --- Returns an entry from the composed tasks table if possible, otherwise makes an API pull 59 --- Returns an entry from the composed tasks table if possible, otherwise makes an API pull
60
58 local InternalGetTaskInfo = function(questID) 61 local InternalGetTaskInfo = function(questID)
59 local completedTasks = T.Conf.TasksLog
60 if completedTasks[questID] then 62 if completedTasks[questID] then
63 -- if it's a recently completed task, use the information stored for it
61 return true, true, #completedTasks[questID].objectives 64 return true, true, #completedTasks[questID].objectives
62 else 65 else
63 return GetTaskInfo(questID) 66 return GetTaskInfo(questID)
64 end 67 end
65 end 68 end
66 69
67 --- Same as above but for the objective entries 70 --- Same as above but for the objective entries
68 local InternalGetQuestObjectiveInfo = function(questID, objectiveIndex) 71 local InternalGetQuestObjectiveInfo = function(questID, objectiveIndex)
69 local completedTasks = T.Conf.TasksLog
70 if ( completedTasks[questID] ) then 72 if ( completedTasks[questID] ) then
71 print('using internal data') 73 print('using internal data')
72 return completedTasks[questID].objectives[objectiveIndex], completedTasks[questID].objectiveType, true; 74 return completedTasks[questID].objectives[objectiveIndex], completedTasks[questID].objectiveType, true;
73 else 75 else
74 return GetQuestObjectiveInfo(questID, objectiveIndex, false); 76 return GetQuestObjectiveInfo(questID, objectiveIndex, false);
109 111
110 for i, questID in ipairs(tasks) do 112 for i, questID in ipairs(tasks) do
111 local isInArea, isOnMap, numObjectives = InternalGetTaskInfo(questID) 113 local isInArea, isOnMap, numObjectives = InternalGetTaskInfo(questID)
112 local existingTask = self.InfoBlock[questID] 114 local existingTask = self.InfoBlock[questID]
113 local displayObjectiveHeader = false; 115 local displayObjectiveHeader = false;
114 if CanShowTask(isInArea, isOnMap, existingTask) then 116 local displayTask = CanShowTask(isInArea, isOnMap, existingTask)
117 if displayTask then
115 print('TaskInfo', '|cFF00FF00showable objective list', questID) 118 print('TaskInfo', '|cFF00FF00showable objective list', questID)
116 self.Info[questID] = self.Info[questID] or {} 119 self.Info[questID] = self.Info[questID] or {}
117 120
118 local t = self.Info[questID] 121 local t = self.Info[questID]
119 if (isOnMap or isInArea) and existingTask then 122 if (isOnMap or isInArea) and existingTask then
124 end 127 end
125 128
126 local taskTitle 129 local taskTitle
127 t.id = questID 130 t.id = questID
128 t.objectives = {} 131 t.objectives = {}
129 local taskFinished = true; 132 local isComplete = true;
130 for objectiveIndex = 1, numObjectives do 133 for objectiveIndex = 1, numObjectives do
131 local text, objectiveType, finished, displayAsObjective = InternalGetQuestObjectiveInfo(questID, objectiveIndex, false); 134 local text, objectiveType, finished, displayAsObjective = InternalGetQuestObjectiveInfo(questID, objectiveIndex, false);
132 displayObjectiveHeader = displayObjectiveHeader or displayAsObjective; 135 displayObjectiveHeader = displayObjectiveHeader or displayAsObjective;
133 if not taskTitle then 136 if not taskTitle then
134 if objectiveType == 'progressbar' and not text:match('^%d%+\\%d+') then 137 if objectiveType == 'progressbar' and not text:match('^%d%+\\%d+') then
145 o.index = objectiveIndex 148 o.index = objectiveIndex
146 o.text = text 149 o.text = text
147 o.type = objectiveType 150 o.type = objectiveType
148 o.finished = finished 151 o.finished = finished
149 o.displayAsObjective = displayAsObjective 152 o.displayAsObjective = displayAsObjective
153 isComplete = (isComplete and finished)
150 end 154 end
151 155
152 T.SetRewards(t, questID) 156 T.SetRewards(t, questID)
153 157
154 -- didn't get a name from progress bar? what about area name 158 -- didn't get a name from progress bar? what about area name
163 t.existingTask = existingTask 167 t.existingTask = existingTask
164 t.questID = questID 168 t.questID = questID
165 t.id = questID 169 t.id = questID
166 t.taskIndex = i 170 t.taskIndex = i
167 t.title = taskTitle 171 t.title = taskTitle
172 t.isComplete = isComplete
168 self.WatchList[i] = t 173 self.WatchList[i] = t
169 elseif existingTask then 174 elseif existingTask then
170 print('TaskInfo', '|cFFFF4400hideable task', questID) 175 print('TaskInfo', '|cFFFF4400hideable task', questID)
171 existingTask:Hide() 176 existingTask:Hide()
172 end 177 end
173 178
174 print ('TaskInfo', i, 'questID', questID, 'inArea', isInArea, 'onMap', isOnMap, 'existing', (existingTask and 'Y' or 'N'), (test and '|cFF00FF00show|r' or '|cFFFF0088hide|r')) 179
180 print ('TaskInfo', i, '|cFFFFFF00'.. questID..'|r', '('..(isInArea and '|cFF88FF88' or '|cFF666666') .. 'isInArea|r', 'AND', (isOnMap and '|cFF88FF88' or '|cFF666666') .. 'isOnMap|r)', 'OR', (existingTask and '|cFF88FF88' or '|cFF666666') .. 'existingTask|r', (displayTask and '|cFF00FF00show|r' or '|cFFFF4400hide|r'))
175 end 181 end
176 182
177 183
178 self.numWatched = #self.WatchList 184 self.numWatched = #self.WatchList
179 self.numAll = #existingTasks 185 self.numAll = #existingTasks
180 return self.numWatched, self.numWatched, self.WatchList 186 return self.numWatched, self.numWatched, self.WatchList
187 end
188
189 Bonus.OnEvent = function(block, event, ...)
190 if event == 'QUEST_LOG_UPDATE' then
191 local info = block.info
192
193 local isInArea, isOnMap, numObjectives = InternalGetTaskInfo(info.questID)
194 if not CanShowTask(isInArea, isOnMap, block, numObjectives) then
195 block:Hide()
196 end
197 end
198 end
199
200 Bonus.GetBlock = function(self, index)
201 local block = Default.GetBlock(self, index)
202 block:SetScript('OnEvent', self.OnEvent)
203 block:RegisterEvent('QUEST_LOG_UPDATE')
204 return block
181 end 205 end
182 206
183 --- info cleanup done when turn-ins are detected 207 --- info cleanup done when turn-ins are detected
184 Bonus.OnTurnIn = function(self, block, questID, xp, money) 208 Bonus.OnTurnIn = function(self, block, questID, xp, money)
185 --[=[ 209 --[=[
252 local print = lprint 276 local print = lprint
253 local text, attachment = '', nil 277 local text, attachment = '', nil
254 if data.type == 'progressbar' then 278 if data.type == 'progressbar' then
255 print(' |cFFFF44DDpercent='..tostring(GetQuestProgressBarPercent(info.questID))) 279 print(' |cFFFF44DDpercent='..tostring(GetQuestProgressBarPercent(info.questID)))
256 local percent = 100 280 local percent = 100
281 if not data.finished then
282 percent = GetQuestProgressBarPercent(info.questID)
283 end
284 data.value = percent
285 data.maxValue = 100
286
257 attachment = T.GetWidget(data, 'StatusBar', info.questID..'-'..data.index) 287 attachment = T.GetWidget(data, 'StatusBar', info.questID..'-'..data.index)
258 attachment:SetParent(block) 288 attachment:SetParent(block)
259
260 if not data.finished then
261 percent = GetQuestProgressBarPercent(info.questID)
262 end
263 data.value = percent
264 data.maxValue = 100
265
266 print(attachment:GetNumPoints()) 289 print(attachment:GetNumPoints())
267 for i = 1, attachment:GetNumPoints() do 290 for i = 1, attachment:GetNumPoints() do
268 print(' ',attachment:GetPoint(i)) 291 print(' ',attachment:GetPoint(i))
269 end 292 end
270
271 293
272 attachment.value = percent 294 attachment.value = percent
273 attachment.maxValue = 100 295 attachment.maxValue = 100
274 attachment.status:SetFormattedText(PERCENTAGE_STRING, percent) 296 attachment.status:SetFormattedText(PERCENTAGE_STRING, percent)
275 --attachment:SetParent(handler.frame) 297 --attachment:SetParent(handler.frame)