Nenue@77
|
1 -- Veneer
|
Nenue@77
|
2 -- ObjectiveTracker.lua
|
Nenue@77
|
3 -- Created: 8/16/2016 8:19 AM
|
Nenue@77
|
4 -- %file-revision%
|
Nenue@77
|
5 -- This is more or less a copy of the blizzard code with some customization stuff added
|
Nenue@77
|
6
|
Nenue@77
|
7 local plugin = VeneerObjectives
|
Nenue@77
|
8 local vn, print = LibStub("LibKraken").register(Veneer, VeneerObjectives)
|
Nenue@77
|
9 local ot
|
Nenue@77
|
10 local otvn
|
Nenue@77
|
11
|
Nenue@77
|
12 local band, floor, min = bit.band, math.floor, math.min
|
Nenue@77
|
13
|
Nenue@77
|
14
|
Nenue@77
|
15 local X_QUEST = 0x00001;
|
Nenue@77
|
16 local X_QUEST_ADDED = 0x00002;
|
Nenue@77
|
17 local X_TASK_ADDED = 0x00004;
|
Nenue@77
|
18 local X_WORLD_QUEST_ADDED = 0x00008;
|
Nenue@77
|
19 local X_SCENARIO = 0x00010;
|
Nenue@77
|
20 local X_SCENARIO_NEW_STAGE = 0x00020;
|
Nenue@77
|
21 local X_ACHIEVEMENT = 0x00040;
|
Nenue@77
|
22 local X_ACHIEVEMENT_ADDED = 0x00080;
|
Nenue@77
|
23 local X_SCENARIO_BONUS_DELAYED = 0x00100;
|
Nenue@77
|
24 local X_SUPER_TRACK_CHANGED = 0x00200;
|
Nenue@77
|
25 -- these are for the specific module ONLY!
|
Nenue@77
|
26 local X_MODULE_QUEST = 0x00400;
|
Nenue@77
|
27 local X_MODULE_AUTO_QUEST_POPUP = 0x00800;
|
Nenue@77
|
28 local X_MODULE_BONUS_OBJECTIVE = 0x01000;
|
Nenue@77
|
29 local X_MODULE_WORLD_QUEST = 0x02000;
|
Nenue@77
|
30 local X_MODULE_SCENARIO = 0x04000;
|
Nenue@77
|
31 local X_MODULE_ACHIEVEMENT = 0x08000;
|
Nenue@77
|
32 local X_SCENARIO_SPELLS = 0x10000;
|
Nenue@77
|
33 -- special updates
|
Nenue@77
|
34 local X_STATIC = 0x0000;
|
Nenue@77
|
35 local X_ALL = 0xFFFF;
|
Nenue@77
|
36
|
Nenue@77
|
37 -- state information
|
Nenue@77
|
38 local X_REASON = X_ALL; -- default
|
Nenue@77
|
39 local X_MONEY = 0
|
Nenue@77
|
40 local X_ANIMATION = 0
|
Nenue@77
|
41 local X_ID = 0;
|
Nenue@77
|
42
|
Nenue@77
|
43 local INSET_V = -20
|
Nenue@77
|
44
|
Nenue@77
|
45
|
Nenue@77
|
46
|
Nenue@77
|
47 local trackerWidth = 240
|
Nenue@77
|
48 local blockIndent = 12
|
Nenue@77
|
49 local blockSpacing = 3
|
Nenue@77
|
50
|
Nenue@77
|
51 local tracker = {
|
Nenue@77
|
52 freeBlocks = {},
|
Nenue@77
|
53 usedBlocks = {},
|
Nenue@77
|
54 freeProgressBars = {},
|
Nenue@77
|
55 usedProgressBars = {},
|
Nenue@77
|
56 freeTimers = {},
|
Nenue@77
|
57 usedTimers = {},
|
Nenue@77
|
58 freeLines = {},
|
Nenue@77
|
59
|
Nenue@77
|
60 headerText = 'Default Header',
|
Nenue@77
|
61 contentHeight = 0,
|
Nenue@77
|
62 animationHeight = 0,
|
Nenue@77
|
63 updateReasonModule = 0,
|
Nenue@77
|
64 updateReasonEvents = 0,
|
Nenue@77
|
65 }
|
Nenue@77
|
66 local GetTrackerHandler = function(handler)
|
Nenue@77
|
67 handler = handler or {}
|
Nenue@77
|
68 setmetatable(handler, {__index=tracker})
|
Nenue@77
|
69 return handler
|
Nenue@77
|
70 end
|
Nenue@77
|
71
|
Nenue@77
|
72 local Header_OnAnimationStart = function (self, forced)
|
Nenue@77
|
73 local header = self:GetParent()
|
Nenue@77
|
74 header.animating = true
|
Nenue@77
|
75 plugin:UpdateAnimation(header)
|
Nenue@77
|
76 end
|
Nenue@77
|
77
|
Nenue@77
|
78 local Header_OnAnimationFinished = function (self, forced)
|
Nenue@77
|
79 local header = self:GetParent()
|
Nenue@77
|
80 header.animating = nil
|
Nenue@77
|
81 plugin:Update(X_ANIMATION)
|
Nenue@77
|
82 end
|
Nenue@77
|
83
|
Nenue@77
|
84 -- reset generic flags for layout compilation
|
Nenue@77
|
85 function tracker:InitLayout (isStatic)
|
Nenue@77
|
86 print('|cFF00FFFFlayout|r', self.headerText)
|
Nenue@77
|
87 self.firstBlock = nil
|
Nenue@77
|
88 self.lastBlock = nil
|
Nenue@77
|
89 self.currentBlock = nil
|
Nenue@77
|
90 self.oldContentHeight = self.contentHeight
|
Nenue@77
|
91 self.oldAnimationHeight = self.animationHeight
|
Nenue@77
|
92 self.numBlocks = 0
|
Nenue@77
|
93 for id, block in pairs(self.usedBlocks) do
|
Nenue@77
|
94 block.used = nil
|
Nenue@77
|
95 end
|
Nenue@77
|
96 if not isStatic then
|
Nenue@77
|
97 self.hasSkippedBlocks = false
|
Nenue@77
|
98 end
|
Nenue@77
|
99
|
Nenue@77
|
100 if not self.header then
|
Nenue@77
|
101 self:SetHeader(self.headerText, X_REASON)
|
Nenue@77
|
102 self.header:SetPoint('TOPLEFT', plugin, 'TOPLEFT', 0, -plugin.contentHeight)
|
Nenue@77
|
103 plugin.contentHeight = plugin.contentHeight + self.header:GetHeight()
|
Nenue@77
|
104 end
|
Nenue@77
|
105
|
Nenue@77
|
106
|
Nenue@77
|
107 self.contentHeight = 0
|
Nenue@77
|
108
|
Nenue@77
|
109 end
|
Nenue@77
|
110
|
Nenue@77
|
111 -- clear out generic flags and set aside block frames for re-use
|
Nenue@77
|
112 tracker.EndLayout = function(self)
|
Nenue@77
|
113 self.lastBlock = self.currentBlock
|
Nenue@77
|
114 for id, block in pairs(self.usedBlocks) do
|
Nenue@77
|
115 if not block.used then
|
Nenue@77
|
116 self:FreeBlock(block)
|
Nenue@77
|
117 end
|
Nenue@77
|
118 end
|
Nenue@77
|
119 end
|
Nenue@77
|
120
|
Nenue@77
|
121 function tracker:SetHeader (text, animateReason)
|
Nenue@77
|
122 if self.header then
|
Nenue@77
|
123 return self.header
|
Nenue@77
|
124 end
|
Nenue@77
|
125
|
Nenue@77
|
126 local block = CreateFrame('Button', nil, plugin, 'VeneerObjectiveHeader')
|
Nenue@77
|
127 block.handler = self
|
Nenue@77
|
128 block.text:SetText(self.headerText)
|
Nenue@77
|
129
|
Nenue@77
|
130 self.currentBlock = block
|
Nenue@77
|
131 self.header = block
|
Nenue@77
|
132 return block
|
Nenue@77
|
133 end
|
Nenue@77
|
134
|
Nenue@77
|
135 function tracker:FreeBlock(block)
|
Nenue@77
|
136 self.usedBlocks[block.id] = nil
|
Nenue@77
|
137 print('|cFF0088FFfree|r', block:GetName())
|
Nenue@77
|
138 tinsert(self.freeBlocks, block)
|
Nenue@77
|
139
|
Nenue@77
|
140 block.numLines = 0
|
Nenue@77
|
141 block:SetHeight(0)
|
Nenue@77
|
142 block:Hide()
|
Nenue@77
|
143 end
|
Nenue@77
|
144
|
Nenue@77
|
145 -- should only be used in an N-lastN loop
|
Nenue@77
|
146 function tracker:FreeLine(line)
|
Nenue@77
|
147 if line.block then
|
Nenue@77
|
148 line.block.lines[line.index] = nil
|
Nenue@77
|
149 end
|
Nenue@77
|
150 print('|cFF0088FFfree|r', line:GetName())
|
Nenue@77
|
151 local freeLines = line.type or self.freeLines
|
Nenue@77
|
152 tinsert(freeLines, line)
|
Nenue@77
|
153 end
|
Nenue@77
|
154
|
Nenue@77
|
155 local blocksn = 0
|
Nenue@77
|
156 tracker.GetBlock = function(self, id)
|
Nenue@77
|
157 local block = self.usedBlocks[id]
|
Nenue@77
|
158 if not block then
|
Nenue@77
|
159 local numFree = #self.freeBlocks
|
Nenue@77
|
160 if numFree >= 1 then
|
Nenue@77
|
161 block = tremove(self.freeBlocks, numFree)
|
Nenue@77
|
162 else
|
Nenue@77
|
163 blocksn = blocksn + 1
|
Nenue@77
|
164 block = CreateFrame('Button', 'OTVNBlock'..blocksn, plugin, 'VeneerObjectiveBlock')
|
Nenue@77
|
165 block.lines = {}
|
Nenue@77
|
166 end
|
Nenue@77
|
167 self.usedBlocks[id] = block
|
Nenue@77
|
168 block.id = id
|
Nenue@77
|
169 block.handler = self
|
Nenue@77
|
170 end
|
Nenue@77
|
171
|
Nenue@77
|
172 block.used = true
|
Nenue@77
|
173 block.currentLine = nil
|
Nenue@77
|
174 block.numLines = 0
|
Nenue@77
|
175
|
Nenue@77
|
176 if block.lines then
|
Nenue@77
|
177 for i, line in ipairs(block.lines) do
|
Nenue@77
|
178 line.used = nil
|
Nenue@77
|
179 end
|
Nenue@77
|
180 end
|
Nenue@77
|
181
|
Nenue@77
|
182 block.contentHeight = blockSpacing
|
Nenue@77
|
183 block:SetWidth(trackerWidth)
|
Nenue@77
|
184 block:SetHeight(0)
|
Nenue@77
|
185
|
Nenue@77
|
186 return block
|
Nenue@77
|
187 end
|
Nenue@77
|
188
|
Nenue@77
|
189 -- obtain line
|
Nenue@77
|
190 local linesn = 0
|
Nenue@77
|
191 function tracker:GetLine(block, index, lineType)
|
Nenue@77
|
192 local line = block.lines[index]
|
Nenue@77
|
193 if line and line.lineType ~= lineType then
|
Nenue@77
|
194
|
Nenue@77
|
195 tinsert(self.freeLines, line)
|
Nenue@77
|
196 line = nil
|
Nenue@77
|
197 end
|
Nenue@77
|
198
|
Nenue@77
|
199 if not line then
|
Nenue@77
|
200 local freeLines = (lineType and lineType.freeLines) or self.freeLines
|
Nenue@77
|
201 local numFreeLines = #freeLines
|
Nenue@77
|
202 if numFreeLines >= 1 then
|
Nenue@77
|
203 line = tremove(freeLines, numFreeLines)
|
Nenue@77
|
204 else
|
Nenue@77
|
205 linesn = linesn + 1
|
Nenue@77
|
206 line = CreateFrame('Frame', 'OTVNLine'.. linesn, block, (lineType and lineType.template) or 'VeneerObjectiveLine')
|
Nenue@77
|
207 end
|
Nenue@77
|
208 line:SetParent(block)
|
Nenue@77
|
209 end
|
Nenue@77
|
210
|
Nenue@77
|
211 line.type = lineType
|
Nenue@77
|
212 line.index = index
|
Nenue@77
|
213 line.used = true
|
Nenue@77
|
214 line.block = block
|
Nenue@77
|
215 line.text:SetPoint('TOPLEFT', line, 'TOPLEFT', blockIndent, 0)
|
Nenue@77
|
216 line:SetHeight(0) -- in order for GetStringHeight to be useful
|
Nenue@77
|
217
|
Nenue@77
|
218 block.lines[index] = line
|
Nenue@77
|
219
|
Nenue@77
|
220 return line
|
Nenue@77
|
221 end
|
Nenue@77
|
222
|
Nenue@77
|
223 function tracker:AddProgressBar(block, line, questID)
|
Nenue@77
|
224 end
|
Nenue@77
|
225
|
Nenue@77
|
226 function tracker:FreeProgressBar(block, line)
|
Nenue@77
|
227 end
|
Nenue@77
|
228
|
Nenue@77
|
229 function tracker:AddTimerBar(block, line, duration, startTime)
|
Nenue@77
|
230 end
|
Nenue@77
|
231
|
Nenue@77
|
232 function tracker:FreeTimerBar(block, line)
|
Nenue@77
|
233 end
|
Nenue@77
|
234
|
Nenue@77
|
235 -- Checks for space and anchors or frees the block accordingly
|
Nenue@77
|
236 function tracker:AddBlock (block, force)
|
Nenue@77
|
237 local anchor = self.currentBlock or self.header
|
Nenue@77
|
238 self.numBlocks = self.numBlocks + 1
|
Nenue@77
|
239
|
Nenue@77
|
240 if block.header then
|
Nenue@77
|
241 print('header!', floor(block.contentHeight), '+', floor(block.header:GetStringHeight()))
|
Nenue@77
|
242 block.contentHeight = block.contentHeight + block.header:GetStringHeight()
|
Nenue@77
|
243 self.used = true
|
Nenue@77
|
244 end
|
Nenue@77
|
245
|
Nenue@77
|
246
|
Nenue@77
|
247 if self.currentBlock then
|
Nenue@77
|
248 self.currentBlock.nextBlock = block
|
Nenue@77
|
249 block.prevBlock = self.currentBlock
|
Nenue@77
|
250 else
|
Nenue@77
|
251 self.firstBlock = block
|
Nenue@77
|
252 end
|
Nenue@77
|
253
|
Nenue@77
|
254 self.contentHeight = self.contentHeight + block.contentHeight
|
Nenue@77
|
255 self.currentBlock = block
|
Nenue@77
|
256
|
Nenue@77
|
257 if not plugin.currentBlock then
|
Nenue@77
|
258 plugin.firstBlock = block
|
Nenue@77
|
259 end
|
Nenue@77
|
260 plugin.currentBlock = block
|
Nenue@77
|
261
|
Nenue@77
|
262
|
Nenue@77
|
263
|
Nenue@77
|
264 block:SetHeight(block.contentHeight)
|
Nenue@77
|
265 print('block|cFF88FF00', self.numBlocks, block, '|rto', anchor, 'size', block.contentHeight)
|
Nenue@77
|
266 block:ClearAllPoints()
|
Nenue@77
|
267 block:SetPoint('TOPLEFT', anchor, 'BOTTOMLEFT', 0, -blockSpacing)
|
Nenue@77
|
268 block:Show()
|
Nenue@77
|
269
|
Nenue@77
|
270 -- free unused lines
|
Nenue@77
|
271 local numLines = #block.lines
|
Nenue@77
|
272 for i = 1, numLines do
|
Nenue@77
|
273 local line = block.lines[i]
|
Nenue@77
|
274 if not line.used or block.collapsed then
|
Nenue@77
|
275 print('|cFFFF4400!|r')
|
Nenue@77
|
276 self:FreeLine(line)
|
Nenue@77
|
277 else
|
Nenue@77
|
278 if not line:IsShown() then
|
Nenue@77
|
279 line:Show()
|
Nenue@77
|
280 end
|
Nenue@77
|
281 end
|
Nenue@77
|
282 end
|
Nenue@77
|
283
|
Nenue@77
|
284 return true
|
Nenue@77
|
285 end
|
Nenue@77
|
286
|
Nenue@77
|
287 function tracker:SetLine(block, index, lineType, textOrFunc)
|
Nenue@77
|
288 local anchor = block.currentLine or block.header
|
Nenue@77
|
289 local line = self:GetLine(block, index, lineType)
|
Nenue@77
|
290
|
Nenue@77
|
291 if line.ticker then
|
Nenue@77
|
292 line.ticker:Cancel()
|
Nenue@77
|
293 line.ticker = nil
|
Nenue@77
|
294 end
|
Nenue@77
|
295
|
Nenue@77
|
296 local text = textOrFunc
|
Nenue@77
|
297 if type(textOrFunc) == 'function' then
|
Nenue@77
|
298 text = textOrFunc()
|
Nenue@77
|
299
|
Nenue@77
|
300 line.ticker = C_Timer.NewTicker(10, function()
|
Nenue@77
|
301 line.height = tracker:SetLineText(line.text, textOrTextFunc())
|
Nenue@77
|
302 line:SetHeight(line.height)
|
Nenue@77
|
303 end)
|
Nenue@77
|
304 end
|
Nenue@77
|
305 line.height = tracker:SetLineText(line.text, text)
|
Nenue@77
|
306 line:SetHeight(line.height)
|
Nenue@77
|
307
|
Nenue@77
|
308 print('line|cFFFFFF00', line:GetName(), '|rto', anchor:GetName(), 'size', line.height)
|
Nenue@77
|
309 line:SetPoint('TOPLEFT', anchor, 'BOTTOMLEFT', 0, 0)
|
Nenue@77
|
310
|
Nenue@77
|
311 block.contentHeight = block.contentHeight + line.height
|
Nenue@77
|
312 block.numLines = block.numLines + 1
|
Nenue@77
|
313
|
Nenue@77
|
314 if block.currentLine then
|
Nenue@77
|
315 line.prevLine = block.currentLine
|
Nenue@77
|
316 block.currentLine.nextLine = line
|
Nenue@77
|
317 else
|
Nenue@77
|
318 block.firstLine = line
|
Nenue@77
|
319 end
|
Nenue@77
|
320
|
Nenue@77
|
321 block.currentLine = line
|
Nenue@77
|
322 plugin.currentLine = line
|
Nenue@77
|
323
|
Nenue@77
|
324 end
|
Nenue@77
|
325
|
Nenue@77
|
326 function tracker:SetLineText(fontString, text)
|
Nenue@77
|
327 fontString:SetText(text)
|
Nenue@77
|
328 return fontString:GetStringHeight()
|
Nenue@77
|
329 end
|
Nenue@77
|
330
|
Nenue@77
|
331 -- Update lite
|
Nenue@77
|
332 function tracker:ResetAnchors ()
|
Nenue@77
|
333 self:InitLayout()
|
Nenue@77
|
334
|
Nenue@77
|
335 self:EndLayout()
|
Nenue@77
|
336 end
|
Nenue@77
|
337
|
Nenue@77
|
338
|
Nenue@77
|
339 local UpdateQuestTracker = function(watchIndex, logIndex)
|
Nenue@77
|
340 return true
|
Nenue@77
|
341 end
|
Nenue@77
|
342
|
Nenue@77
|
343 -- top-down updaters
|
Nenue@77
|
344
|
Nenue@77
|
345 local questTracker = GetTrackerHandler({
|
Nenue@77
|
346 headerText = 'Quests',
|
Nenue@77
|
347 updateReasonModule = X_MODULE_QUEST,
|
Nenue@77
|
348 updateReasonEvents = (X_QUEST + X_QUEST_ADDED),
|
Nenue@77
|
349 })
|
Nenue@77
|
350 function questTracker:Update ()
|
Nenue@77
|
351 self:InitLayout()
|
Nenue@77
|
352 for watchIndex = 1, GetNumQuestWatches() do
|
Nenue@77
|
353 local questID, title, questLogIndex, numObjectives, requiredMoney, isComplete, startEvent, isAutoComplete, failureTime, timeElapsed, questType, isTask, isBounty, isStory, isOnMap, hasLocalPOI = GetQuestWatchInfo(watchIndex)
|
Nenue@77
|
354 if not questID then
|
Nenue@77
|
355 -- stop parsing; end of data or variables haven't completely loaded
|
Nenue@77
|
356 break
|
Nenue@77
|
357 end
|
Nenue@77
|
358 local showQuest = true
|
Nenue@77
|
359 if isTask or (isBounty and not IsQuestComplete(questID)) then
|
Nenue@77
|
360 -- do nothing
|
Nenue@77
|
361 else
|
Nenue@77
|
362 -- obtain a block
|
Nenue@77
|
363 local block = self:GetBlock(questID)
|
Nenue@77
|
364
|
Nenue@77
|
365 block.header:SetText(title)
|
Nenue@77
|
366
|
Nenue@77
|
367 for i = 1, numObjectives do
|
Nenue@77
|
368 local text, objectiveType, finished = GetQuestLogLeaderBoard(i, questLogIndex)
|
Nenue@77
|
369 if text then
|
Nenue@77
|
370 self:SetLine(block, i, nil, text)
|
Nenue@77
|
371 end
|
Nenue@77
|
372 end
|
Nenue@77
|
373
|
Nenue@77
|
374 block:SetScript('OnClick', self.OnClick)
|
Nenue@77
|
375 block:RegisterForClicks('AnyDown')
|
Nenue@77
|
376
|
Nenue@77
|
377 self:AddBlock(block)
|
Nenue@77
|
378 end
|
Nenue@77
|
379 end
|
Nenue@77
|
380
|
Nenue@77
|
381 self:EndLayout()
|
Nenue@77
|
382 end
|
Nenue@77
|
383 questTracker.OnClick = function(block, button)
|
Nenue@77
|
384 if button == 'RightButton' then
|
Nenue@77
|
385 ObjectiveTracker_ToggleDropDown(block, QuestObjectiveTracker_OnOpenDropDown)
|
Nenue@77
|
386 else
|
Nenue@77
|
387 CloseDropDownMenus()
|
Nenue@77
|
388
|
Nenue@77
|
389 local questLogIndex = GetQuestLogIndexByID(block.id)
|
Nenue@77
|
390 if ( IsModifiedClick("QUESTWATCHTOGGLE") ) then
|
Nenue@77
|
391 QuestObjectiveTracker_UntrackQuest(nil, block.id);
|
Nenue@77
|
392 else
|
Nenue@77
|
393 if ( IsQuestComplete(block.id) and GetQuestLogIsAutoComplete(questLogIndex) ) then
|
Nenue@77
|
394 AutoQuestPopupTracker_RemovePopUp(block.id);
|
Nenue@77
|
395 ShowQuestComplete(questLogIndex);
|
Nenue@77
|
396 else
|
Nenue@77
|
397 QuestLogPopupDetailFrame_Show(questLogIndex);
|
Nenue@77
|
398 end
|
Nenue@77
|
399 end
|
Nenue@77
|
400 end
|
Nenue@77
|
401 end
|
Nenue@77
|
402
|
Nenue@77
|
403 local UpdateAchievementTracker = function() end
|
Nenue@77
|
404 local UpdateTaskTracker = function() end
|
Nenue@77
|
405 local UpdateScenarioTracker = function() end
|
Nenue@77
|
406
|
Nenue@77
|
407 function plugin:Update(reason, id)
|
Nenue@77
|
408
|
Nenue@77
|
409 print('update', reason, #plugin.trackers)
|
Nenue@77
|
410
|
Nenue@77
|
411 if plugin.minimized then
|
Nenue@77
|
412 for i, tracker in ipairs(plugin.trackers) do
|
Nenue@77
|
413 tracker:Hide()
|
Nenue@77
|
414 end
|
Nenue@77
|
415 return
|
Nenue@77
|
416 end
|
Nenue@77
|
417
|
Nenue@77
|
418
|
Nenue@77
|
419 local X_REASON = reason or X_ALL
|
Nenue@77
|
420 local X_ID = id
|
Nenue@77
|
421
|
Nenue@77
|
422 plugin.maxHeight = plugin:GetHeight()
|
Nenue@77
|
423 plugin.oldContentsHeight = plugin.contentHeight
|
Nenue@77
|
424 plugin.contentHeight = 0
|
Nenue@77
|
425 plugin.currentBlock = nil
|
Nenue@77
|
426 plugin.firstBlock = nil
|
Nenue@77
|
427 plugin:SetWidth(trackerWidth)
|
Nenue@77
|
428
|
Nenue@77
|
429 -- pad for header
|
Nenue@77
|
430 plugin.contentHeight = plugin.header:GetHeight()
|
Nenue@77
|
431
|
Nenue@77
|
432 for i, header in ipairs(plugin.trackers) do
|
Nenue@77
|
433 header.used = nil
|
Nenue@77
|
434 end
|
Nenue@77
|
435
|
Nenue@77
|
436
|
Nenue@77
|
437 local addedSpace = false
|
Nenue@77
|
438 for i, tracker in ipairs(plugin.trackers) do
|
Nenue@77
|
439 if ( band(X_REASON, tracker.updateReasonModule + tracker.updateReasonEvents ) > 0 ) then
|
Nenue@77
|
440 print('->', tracker.headerText)
|
Nenue@77
|
441 tracker:Update()
|
Nenue@77
|
442 if tracker.oldContentHeight - tracker.contentHeight >= 1 then
|
Nenue@77
|
443 addedSpace = true
|
Nenue@77
|
444 end
|
Nenue@77
|
445 else
|
Nenue@77
|
446 -- if we can fit another header or an animation handler popped, contents need to be generated
|
Nenue@77
|
447 if addedSpace or (tracker.header and tracker.header.animating) then
|
Nenue@77
|
448 print('->', tracker.headerText, 'added space')
|
Nenue@77
|
449 tracker:Update()
|
Nenue@77
|
450 else
|
Nenue@77
|
451 print('->', tracker.headerText, 'lite update')
|
Nenue@77
|
452 -- otherwise, measure contents and hide anything that won't fit
|
Nenue@77
|
453 tracker:ResetAnchors()
|
Nenue@77
|
454 end
|
Nenue@77
|
455 end
|
Nenue@77
|
456 end
|
Nenue@77
|
457
|
Nenue@77
|
458 for i, tracker in ipairs(plugin.trackers) do
|
Nenue@77
|
459 if tracker.currentBlock then
|
Nenue@77
|
460 if not tracker.header:IsShown() then
|
Nenue@77
|
461 tracker.header:Show()
|
Nenue@77
|
462 end
|
Nenue@77
|
463 else
|
Nenue@77
|
464 if tracker.header:IsShown() then
|
Nenue@77
|
465 tracker.header:Hide()
|
Nenue@77
|
466 end
|
Nenue@77
|
467 end
|
Nenue@77
|
468 end
|
Nenue@77
|
469
|
Nenue@77
|
470 if VeneerBuffFrame and VeneerBuffFrame.lastBuff then
|
Nenue@77
|
471 plugin:ClearAllPoints()
|
Nenue@77
|
472 plugin:SetPoint('TOP', VeneerBuffFrame.lastBuff, 'BOTTOM', 0, -4)
|
Nenue@77
|
473 plugin:SetPoint('RIGHT', UIParent, 'RIGHT', -6, 0)
|
Nenue@77
|
474 else
|
Nenue@77
|
475 plugin:ClearAllPoints()
|
Nenue@77
|
476 plugin:SetPoint('TOPRIGHT', UIParent, 'TOPRIGHT', -6, -120)
|
Nenue@77
|
477 end
|
Nenue@77
|
478
|
Nenue@77
|
479 plugin:Show()
|
Nenue@77
|
480 end
|
Nenue@77
|
481
|
Nenue@77
|
482 plugin.init = function()
|
Nenue@77
|
483
|
Nenue@77
|
484 plugin:RegisterEvent("QUEST_LOG_UPDATE")
|
Nenue@77
|
485 plugin:RegisterEvent("TRACKED_ACHIEVEMENT_LIST_CHANGED")
|
Nenue@77
|
486 plugin:RegisterEvent("QUEST_WATCH_LIST_CHANGED")
|
Nenue@77
|
487 plugin:RegisterEvent("QUEST_AUTOCOMPLETE")
|
Nenue@77
|
488 plugin:RegisterEvent("QUEST_ACCEPTED")
|
Nenue@77
|
489 plugin:RegisterEvent("SUPER_TRACKED_QUEST_CHANGED")
|
Nenue@77
|
490 plugin:RegisterEvent("SCENARIO_UPDATE")
|
Nenue@77
|
491 plugin:RegisterEvent("SCENARIO_CRITERIA_UPDATE")
|
Nenue@77
|
492 plugin:RegisterEvent("SCENARIO_SPELL_UPDATE")
|
Nenue@77
|
493 plugin:RegisterEvent("TRACKED_ACHIEVEMENT_UPDATE")
|
Nenue@77
|
494 plugin:RegisterEvent("ZONE_CHANGED_NEW_AREA");
|
Nenue@77
|
495 plugin:RegisterEvent("ZONE_CHANGED");
|
Nenue@77
|
496 plugin:RegisterEvent("QUEST_POI_UPDATE");
|
Nenue@77
|
497 plugin:RegisterEvent("VARIABLES_LOADED");
|
Nenue@77
|
498 plugin:RegisterEvent("QUEST_TURNED_IN");
|
Nenue@77
|
499 plugin:RegisterEvent("PLAYER_MONEY");
|
Nenue@77
|
500
|
Nenue@77
|
501 plugin.trackers = {
|
Nenue@77
|
502 questTracker,
|
Nenue@77
|
503 }
|
Nenue@77
|
504 print('bub')
|
Nenue@77
|
505 end
|
Nenue@77
|
506 function plugin:event(event, ...)
|
Nenue@77
|
507 print('|cFFFF0088' .. event, ...)
|
Nenue@77
|
508 if event == 'QUEST_WATCH_LIST_CHANGED' then
|
Nenue@77
|
509 local questID, added = ...
|
Nenue@77
|
510 if added then
|
Nenue@77
|
511 if not IsQuestBounty(questID) or IsQuestComplete(questId) then
|
Nenue@77
|
512 print(questID, added)
|
Nenue@77
|
513 plugin:Update(X_QUEST_ADDED, questID)
|
Nenue@77
|
514 end
|
Nenue@77
|
515 else
|
Nenue@77
|
516 print()
|
Nenue@77
|
517 plugin:Update(X_QUEST)
|
Nenue@77
|
518 end
|
Nenue@77
|
519 elseif event == 'QUEST_LOG_UPDATE' then
|
Nenue@77
|
520 plugin:Update(X_MODULE_QUEST)
|
Nenue@77
|
521 elseif event == 'QUEST_POI_UPDATE' then
|
Nenue@77
|
522
|
Nenue@77
|
523 if GetCVar("trackQuestSorting") == "proximity" then
|
Nenue@77
|
524 -- todo: sort blocks
|
Nenue@77
|
525 end
|
Nenue@77
|
526 plugin:Update(X_MODULE_QUEST)
|
Nenue@77
|
527 elseif event == 'PLAYER_MONEY' then
|
Nenue@77
|
528 plugin:Update(X_MONEY)
|
Nenue@77
|
529 end
|
Nenue@77
|
530
|
Nenue@77
|
531 end
|
Nenue@77
|
532
|
Nenue@77
|
533 -- adjusts money events bitcode when a tracker is displaying money data
|
Nenue@77
|
534 function plugin:UpdateMoneyFlag(watchMoney, reason)
|
Nenue@77
|
535 if watchMoney then
|
Nenue@77
|
536 if (band(X_MONEY, reason) == 0) then
|
Nenue@77
|
537 X_MONEY = X_MONEY - reason
|
Nenue@77
|
538 end
|
Nenue@77
|
539 else
|
Nenue@77
|
540 if (band(X_MONEY, reason) > 0) then
|
Nenue@77
|
541 X_MONEY = X_MONEY + reason
|
Nenue@77
|
542 end
|
Nenue@77
|
543 end
|
Nenue@77
|
544 end
|
Nenue@77
|
545
|
Nenue@77
|
546 -- used by framescripts to poke the updater when an animation has ended
|
Nenue@77
|
547 function plugin:UpdateAnimation(block)
|
Nenue@77
|
548
|
Nenue@77
|
549 local reason = block.handler.updateReasonEvents
|
Nenue@77
|
550 if block.animating then
|
Nenue@77
|
551 if (band(X_ANIMATION, reason) == 0) then
|
Nenue@77
|
552 X_ANIMATION = X_ANIMATION - reason
|
Nenue@77
|
553 end
|
Nenue@77
|
554 else
|
Nenue@77
|
555 if (band(X_ANIMATION, reason) > 0) then
|
Nenue@77
|
556 X_ANIMATION = X_ANIMATION + reason
|
Nenue@77
|
557 end
|
Nenue@77
|
558 end
|
Nenue@77
|
559 end |