Nenue@28
|
1 local B = select(2,...).frame
|
Nenue@28
|
2 local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
|
Nenue@28
|
3 local _G, ipairs, max, min, unpack, floor, pairs, tostring, type, band = _G, ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band
|
Nenue@30
|
4 local GetQuestWatchInfo, GetQuestLogCompletionText = GetQuestWatchInfo, GetQuestLogCompletionText
|
Nenue@30
|
5 local GetQuestLogLeaderBoard, GetNumQuestLogEntries, GetQuestLogTitle = GetQuestLogLeaderBoard, GetNumQuestLogEntries, GetQuestLogTitle
|
Nenue@30
|
6 local GetQuestLogSpecialItemInfo, GetQuestLogSpecialItemCooldown = GetQuestLogSpecialItemInfo, GetQuestLogSpecialItemCooldown
|
Nenue@30
|
7 local GetSuperTrackedQuestID, GetMoney, C_Scenario, GetCVarBool, GetNumQuestWatches = GetSuperTrackedQuestID, GetMoney, C_Scenario, GetCVarBool, GetNumQuestWatches
|
Nenue@30
|
8 local GetQuestTagInfo, GetMoneyString, GetDistanceSqToQuest, GetQuestFactionGroup = GetQuestTagInfo, GetMoneyString, GetDistanceSqToQuest, GetQuestFactionGroup
|
Nenue@30
|
9 local QUEST_TAG_ACCOUNT, LE_QUEST_FACTION_HORDE, LE_QUEST_FREQUENCY_DAILY, LE_QUEST_FREQUENCY_WEEKLY = QUEST_TAG_ACCOUNT, LE_QUEST_FACTION_HORDE, LE_QUEST_FREQUENCY_DAILY, LE_QUEST_FREQUENCY_WEEKLY
|
Nenue@30
|
10 local QUEST_TAG_TCOORDS, IsQuestSequenced = QUEST_TAG_TCOORDS, IsQuestSequenced
|
Nenue@28
|
11 local Default, Quest = T.DefaultHandler, T.Quest
|
Nenue@37
|
12 local format, wipe, select = format, table.wipe, select
|
Nenue@37
|
13 local wipeall = B.wipeall
|
Nenue@37
|
14 local lprint, iprint, tprint = B.print('Line'), B.print('Info'), B.print('Tracker')
|
Nenue@37
|
15 local print = tprint
|
Nenue@40
|
16 local fprint = B.print('Frame')
|
Nenue@38
|
17
|
Nenue@38
|
18
|
Nenue@30
|
19 local superTrackQuestID, playerMoney, inScenario, showPOIs
|
Nenue@28
|
20 Quest.Update = function(self, reason, ...)
|
Nenue@38
|
21 local print = self.print
|
Nenue@28
|
22 print('QuestTracker:Update() received')
|
Nenue@28
|
23 T.UpdateActionButtons()
|
Nenue@28
|
24 Default.Update(self, reason, ...)
|
Nenue@28
|
25 end
|
Nenue@28
|
26
|
Nenue@28
|
27 T.Quest.numButtons = 0
|
Nenue@28
|
28 local usedButtons = T.Quest.itemButtons
|
Nenue@28
|
29 local freeButtons = T.Quest.freeButtons
|
Nenue@28
|
30
|
Nenue@38
|
31 Quest.UpdateObjectives = function(self, block)
|
Nenue@28
|
32 local print = lprint
|
Nenue@38
|
33 print('|cFF'..self.internalColor..'UpdateObjectives()')
|
Nenue@28
|
34 local info = block.info
|
Nenue@28
|
35
|
Nenue@28
|
36 print((info.isAccount and 'isAccount' or ''), (info.isFaction and 'isFaction' or ''), (info.isDaily and 'isDaily' or ''), (info.isWeekly and 'isWeekly' or ''), info.tagID, info.tagName)
|
Nenue@28
|
37
|
Nenue@38
|
38 local displayObjectives = true
|
Nenue@34
|
39 local block_schema = 'default'
|
Nenue@28
|
40 if info.isAccount then
|
Nenue@28
|
41 if info.isFaction then
|
Nenue@28
|
42 print(' faction', info.tagID)
|
Nenue@34
|
43 block_schema = 'faction_'..info.tagID
|
Nenue@28
|
44 else
|
Nenue@28
|
45 print(' account', info.isAccount, info.isFaction)
|
Nenue@34
|
46 block_schema = 'account'
|
Nenue@28
|
47 end
|
Nenue@28
|
48 elseif info.isDaily then
|
Nenue@28
|
49 print(' daily', info.frequency)
|
Nenue@34
|
50 block_schema = 'daily'
|
Nenue@28
|
51 elseif info.isWeekly then
|
Nenue@28
|
52 print(' weekly', info.frequency)
|
Nenue@34
|
53 block_schema = 'weekly'
|
Nenue@28
|
54 end
|
Nenue@28
|
55 local completionText
|
Nenue@28
|
56 if info.isComplete then
|
Nenue@44
|
57 if T.Conf.ShowCompletionText then
|
Nenue@44
|
58 self:AddLine(block, info.completionText, nil, 'complete')
|
Nenue@28
|
59 end
|
Nenue@44
|
60 if not T.Conf.ShowObjectivesWhenComplete then
|
Nenue@44
|
61 displayObjectives = false
|
Nenue@44
|
62 end
|
Nenue@38
|
63 print('|cFF'..self.internalColor..' :: complete quest :: show instruction: "'.. tostring(info.completionText) .. '"')
|
Nenue@44
|
64 block_schema = 'complete'
|
Nenue@28
|
65 end
|
Nenue@28
|
66
|
Nenue@38
|
67 Default.UpdateObjectives(self, block, block_schema, displayObjectives)
|
Nenue@40
|
68 return 0, block_schema
|
Nenue@28
|
69 end
|
Nenue@28
|
70
|
Nenue@38
|
71 Quest.UpdateLine = function(handler, block, data)
|
Nenue@28
|
72 local objectiveType = data.type
|
Nenue@31
|
73 return data.text, nil, objectiveType
|
Nenue@28
|
74 end
|
Nenue@28
|
75
|
Nenue@28
|
76 -----------------------------
|
Nenue@28
|
77 --- QUEST
|
Nenue@37
|
78 local tremove, tinsert = tremove, tinsert
|
Nenue@37
|
79 local GetQuestLogIndexByID, IsQuestWatched = GetQuestLogIndexByID, IsQuestWatched
|
Nenue@28
|
80 Quest.QuestBlock = {}
|
Nenue@28
|
81 Quest.LogBlock = {}
|
Nenue@28
|
82 Quest.LogInfo = {}
|
Nenue@37
|
83
|
Nenue@39
|
84 Quest.OnRemoved = function(block)
|
Nenue@37
|
85
|
Nenue@37
|
86 end
|
Nenue@39
|
87
|
Nenue@39
|
88 Quest.GetBlock = function(self, index)
|
Nenue@39
|
89 local block = Default.GetBlock(self, index)
|
Nenue@39
|
90 block:SetScript('OnEvent', Quest.OnRemoved)
|
Nenue@39
|
91 block:RegisterEvent('QUEST_REMOVED')
|
Nenue@39
|
92 return block
|
Nenue@39
|
93 end
|
Nenue@39
|
94
|
Nenue@37
|
95 local GetQuestWatchIndex = GetQuestWatchIndex
|
Nenue@43
|
96 local numAnimating = 0
|
Nenue@43
|
97 local blocksChecked = {}
|
Nenue@43
|
98
|
Nenue@37
|
99 --- Get a total of things to show, and straighten out the index while we're at it
|
Nenue@37
|
100 --- Return the number shown, total in log, and the info table to parse
|
Nenue@37
|
101 Quest.GetNumWatched = function (self, id, added)
|
Nenue@38
|
102 local print = self.print
|
Nenue@40
|
103 B.print('Block')('########')
|
Nenue@40
|
104 B.print('Block')('########')
|
Nenue@30
|
105 superTrackQuestID = GetSuperTrackedQuestID()
|
Nenue@30
|
106 playerMoney = GetMoney();
|
Nenue@30
|
107 inScenario = C_Scenario.IsInScenario();
|
Nenue@30
|
108 showPOIs = GetCVarBool("questPOI");
|
Nenue@37
|
109 local numAll = GetNumQuestLogEntries()
|
Nenue@37
|
110 local numWatched = GetNumQuestWatches()
|
Nenue@37
|
111 local bottomIndex = 1
|
Nenue@37
|
112 local start, limit = 1, numAll
|
Nenue@37
|
113
|
Nenue@37
|
114 if id and not added then
|
Nenue@40
|
115 -- if a particular id is supplied, add to checklist
|
Nenue@37
|
116 if self.InfoBlock[id] then
|
Nenue@40
|
117 blocksChecked[self.InfoBlock[id]] = self.InfoBlock[id]
|
Nenue@37
|
118 end
|
Nenue@37
|
119 end
|
Nenue@37
|
120
|
Nenue@43
|
121 numAnimating = 0
|
Nenue@44
|
122 local numEntries = 0
|
Nenue@37
|
123 for logIndex = start, limit do
|
Nenue@37
|
124 local reason1, reason2 = '', ''
|
Nenue@37
|
125 local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(logIndex)
|
Nenue@37
|
126 local watchIndex = GetQuestWatchIndex(logIndex)
|
Nenue@37
|
127
|
Nenue@43
|
128 --- Start of crazy audit flagging
|
Nenue@37
|
129 if watchIndex and watchIndex >= bottomIndex then
|
Nenue@43
|
130 -- do watch data pointers match?
|
Nenue@37
|
131 local watchInfo = self.WatchInfo[watchIndex]
|
Nenue@37
|
132 local watchBlock = self.WatchBlock[watchIndex]
|
Nenue@37
|
133 if watchInfo and watchInfo.questID ~= questID then
|
Nenue@38
|
134 print('GetNumWatched', 'trimming WatchInfo ['..watchIndex..'] =/=', questID)
|
Nenue@37
|
135 self.WatchInfo[watchIndex] = nil
|
Nenue@37
|
136 end
|
Nenue@37
|
137 if watchBlock and watchBlock.info.questID ~= questID then
|
Nenue@38
|
138 print('GetNumWatched', 'trimming WatchBlock ['..watchIndex..'] =/=', watchBlock:GetName())
|
Nenue@37
|
139 self.WatchBlock[watchIndex] = nil
|
Nenue@40
|
140 blocksChecked[watchBlock] = watchBlock
|
Nenue@37
|
141 end
|
Nenue@37
|
142 end
|
Nenue@37
|
143
|
Nenue@43
|
144 -- check log-block pointer
|
Nenue@37
|
145 local logBlock = self.LogBlock[logIndex]
|
Nenue@43
|
146 if logBlock then
|
Nenue@43
|
147 -- check later that the block isn't for a dropped quest
|
Nenue@43
|
148 if logBlock.info.questID ~= questID then
|
Nenue@43
|
149 print('GetQuests', 'replace info', logBlock.info.questID, '->', questID)
|
Nenue@43
|
150 self.LogBlock[logIndex] = nil
|
Nenue@43
|
151 blocksChecked[logBlock] = logBlock
|
Nenue@43
|
152 end
|
Nenue@37
|
153 end
|
Nenue@43
|
154 --- end of crazy audit flagging
|
Nenue@37
|
155
|
Nenue@40
|
156 -- add to watch index if: the questID is non-zero
|
Nenue@37
|
157 if questID ~= 0 then
|
Nenue@44
|
158 self:GetInfo(logIndex, watchIndex)
|
Nenue@44
|
159 print('GetQuests', format('request info |cFF00FF00%2d|r |cFFFFFF00%6d|r |cFFFF4400%3s|r |cFF00FFFF%3s|r', logIndex, questID, tostring(watchIndex or ''), numEntries))
|
Nenue@37
|
160 end
|
Nenue@37
|
161 end
|
Nenue@37
|
162
|
Nenue@44
|
163
|
Nenue@44
|
164
|
Nenue@40
|
165 --- After GetInfo pass, look for any non-conformant blocks and deal with them
|
Nenue@44
|
166 for index, block in ipairs(self.usedBlocks) do
|
Nenue@44
|
167
|
Nenue@40
|
168 local logIndex = GetQuestLogIndexByID(block.info.questID, 'player')
|
Nenue@44
|
169 print('GetNumWatched', '|cFFFF4400'.. index, (block and block:GetName() or '|cFFFF0000-|r'), logIndex or '|cFF444444-|r')
|
Nenue@43
|
170 -- animating blocks have been evaluated
|
Nenue@43
|
171 if not block.isAnimating then
|
Nenue@43
|
172 if not logIndex then
|
Nenue@43
|
173 self:ClearBlock(block)
|
Nenue@44
|
174 print('GetNumWatched', 'trim dropped quest', block:GetName())
|
Nenue@43
|
175 elseif not IsQuestWatched(block.info.logIndex) then
|
Nenue@43
|
176 self:ClearBlock(block)
|
Nenue@44
|
177 print('GetNumWatched', 'trim untracked quest', block:GetName())
|
Nenue@43
|
178 end
|
Nenue@37
|
179 end
|
Nenue@37
|
180 end
|
Nenue@37
|
181
|
Nenue@37
|
182 self.numWatched = numWatched
|
Nenue@37
|
183 self.numAll = numAll
|
Nenue@37
|
184
|
Nenue@44
|
185 print('GetNumWatched', 'RESULT', numWatched, 'of', numAll)
|
Nenue@37
|
186 return numWatched, numAll, self.WatchList
|
Nenue@28
|
187 end
|
Nenue@30
|
188
|
Nenue@37
|
189
|
Nenue@30
|
190 --- Returns an iterable table from which tracker blocks can be filled out. Data includes:
|
Nenue@30
|
191 -- All entry-layer GetXInfo return values
|
Nenue@30
|
192 -- Manifest of line data to be displayed in relation to the tracked object
|
Nenue@37
|
193 Quest.GetInfo = function (self, logIndex, watchIndex)
|
Nenue@28
|
194 local print = iprint
|
Nenue@44
|
195 print('')
|
Nenue@37
|
196 local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(logIndex)
|
Nenue@30
|
197 if ( not questID ) then
|
Nenue@38
|
198 tprint('GetNumWatched', logIndex, watchIndex, '|cFFFF2299no data|r')
|
Nenue@44
|
199 return 0
|
Nenue@28
|
200 end
|
Nenue@28
|
201
|
Nenue@37
|
202 Quest.Info[questID] = Quest.Info[questID] or {}
|
Nenue@44
|
203 local numEntries = 0
|
Nenue@37
|
204 local q = Quest.Info[questID]
|
Nenue@37
|
205 q.questID = questID
|
Nenue@37
|
206 q.id = questID
|
Nenue@37
|
207 q.logIndex = logIndex
|
Nenue@37
|
208 q.watchIndex = watchIndex
|
Nenue@28
|
209
|
Nenue@37
|
210 local numObjectives, requiredMoney, isAutoComplete, failureTime, timeElapsed, questType
|
Nenue@37
|
211 = 0, 0, nil, false, false, 0
|
Nenue@37
|
212 if watchIndex then
|
Nenue@44
|
213 self.print('WatchIndex', watchIndex)
|
Nenue@37
|
214 local _
|
Nenue@44
|
215 _, _, _, numObjectives, requiredMoney, _, _, isAutoComplete,
|
Nenue@37
|
216 failureTime, timeElapsed, questType = GetQuestWatchInfo(watchIndex)
|
Nenue@44
|
217 self.WatchList[watchIndex] = q
|
Nenue@37
|
218 --tprint(' |cFF88FF00GetInfo:|r set watch entry', watchIndex)
|
Nenue@44
|
219 self.print('WatchIndex', logIndex, watchIndex + numAnimating, '|cFFFF2299'..title..'|r')
|
Nenue@37
|
220 end
|
Nenue@37
|
221 self.LogInfo[logIndex] = q
|
Nenue@28
|
222
|
Nenue@37
|
223 q.numObjectives = numObjectives
|
Nenue@37
|
224 q.requiredMoney = requiredMoney
|
Nenue@37
|
225 q.failureTime = failureTime
|
Nenue@37
|
226 q.timeElapsed = timeElapsed
|
Nenue@30
|
227
|
Nenue@37
|
228
|
Nenue@37
|
229
|
Nenue@32
|
230 q.type = 'Quest'
|
Nenue@32
|
231 q.title = title
|
Nenue@32
|
232 q.level = level
|
Nenue@32
|
233 q.displayQuestID = displayQuestID
|
Nenue@32
|
234 q.suggestedGroup = suggestedGroup
|
Nenue@32
|
235
|
Nenue@30
|
236 -- re-use Blizzard logic for consistency
|
Nenue@32
|
237 local showQuest = true
|
Nenue@32
|
238 if isTask then showQuest = false end
|
Nenue@30
|
239 local watchMoney = false;
|
Nenue@30
|
240 local tagID, typeTag, frequencyTag, completionTag, completionText
|
Nenue@30
|
241 local isAccount, isFaction, isWeekly, isDaily = false, false, false, false
|
Nenue@30
|
242 local isBreadcrumb = false
|
Nenue@30
|
243 local questFailed = false
|
Nenue@30
|
244 local watchMoney = false
|
Nenue@30
|
245 local timerInfo, moneyInfo = false, false
|
Nenue@30
|
246 local objectives = q.objectives or {}
|
Nenue@30
|
247
|
Nenue@30
|
248
|
Nenue@30
|
249 -- Case 1: completed quest or "go to thing" breadcrumb
|
Nenue@30
|
250 -- * 1 line containing the completion text
|
Nenue@30
|
251 if ( isComplete and isComplete < 0 ) then
|
Nenue@30
|
252 isComplete = false
|
Nenue@30
|
253 questFailed = true
|
Nenue@30
|
254 elseif ( numObjectives == 0 and playerMoney >= requiredMoney and not startEvent ) then
|
Nenue@30
|
255 isComplete = true;
|
Nenue@30
|
256 questFailed = false
|
Nenue@30
|
257 if ( requiredMoney == 0 ) then
|
Nenue@30
|
258 isBreadcrumb = true;
|
Nenue@30
|
259 end
|
Nenue@30
|
260 end
|
Nenue@44
|
261 print('QuestFlags', (isComplete and 'isComplete' or ''), (questFailed and 'questFailed' or ''), (isBreadcrumb and 'isBreadcrumb' or ''), numObjectives)
|
Nenue@30
|
262
|
Nenue@30
|
263 -- completion message?
|
Nenue@30
|
264 local isSequenced = IsQuestSequenced(questID)
|
Nenue@30
|
265 local temp_status = ''
|
Nenue@30
|
266 if ( isComplete ) then
|
Nenue@30
|
267 temp_status = 'COMPLETED_OBJECTIVES'
|
Nenue@44
|
268 --objectives = Quest.GetObjectives(logIndex, numObjectives, true, isSequenced, isStory)
|
Nenue@44
|
269 q.objectives = objectives
|
Nenue@30
|
270 if ( isAutoComplete ) then
|
Nenue@30
|
271 temp_status = 'AUTOCOMPLETE_OBJECTIVES'
|
Nenue@30
|
272 completionText = _G.QUEST_WATCH_CLICK_TO_COMPLETE
|
Nenue@30
|
273 else
|
Nenue@30
|
274 if ( isBreadcrumb ) then
|
Nenue@30
|
275 temp_status = 'COMPLETE_BREADCRUMB'
|
Nenue@44
|
276 completionText = GetQuestLogCompletionText(logIndex)
|
Nenue@30
|
277 else
|
Nenue@30
|
278 temp_status = 'COMPLETE_READY_FOR_TURN_IN'
|
Nenue@30
|
279 completionText = _G.QUEST_WATCH_QUEST_READY
|
Nenue@30
|
280 end
|
Nenue@30
|
281 end
|
Nenue@30
|
282 elseif ( questFailed ) then
|
Nenue@30
|
283 temp_status = 'FAILED'
|
Nenue@30
|
284 -- Case 2: failed quest
|
Nenue@30
|
285 -- * 1 status line; hide other info
|
Nenue@30
|
286 completionText = _G.FAILED
|
Nenue@30
|
287 else
|
Nenue@30
|
288
|
Nenue@30
|
289 temp_status = 'PROGRESS_OBJECTIVES'
|
Nenue@30
|
290 -- Case 3: quest in progress
|
Nenue@30
|
291 -- * Multiple objective lines
|
Nenue@30
|
292 -- * Possible extra lines for money and timer data respectively
|
Nenue@39
|
293 self.print(' QuestInfo', title, questType, isAutoComplete)
|
Nenue@37
|
294 objectives = Quest.GetObjectives(logIndex, numObjectives, false, isSequenced, isStory)
|
Nenue@30
|
295 q.objectives = objectives
|
Nenue@30
|
296
|
Nenue@30
|
297 --- anything past here gets appended to existing objectives
|
Nenue@30
|
298
|
Nenue@30
|
299 -- money
|
Nenue@30
|
300 if ( requiredMoney > playerMoney ) then
|
Nenue@30
|
301
|
Nenue@30
|
302 temp_status = temp_status .. '_MONEY'
|
Nenue@30
|
303 local text = GetMoneyString(playerMoney).." / "..GetMoneyString(requiredMoney);
|
Nenue@30
|
304 moneyInfo = {
|
Nenue@30
|
305 type = 'money',
|
Nenue@30
|
306 text = text,
|
Nenue@30
|
307 finished = false,
|
Nenue@30
|
308 requiredMoney = requiredMoney,
|
Nenue@30
|
309 playerMoney = playerMoney,
|
Nenue@30
|
310 }
|
Nenue@31
|
311 tinsert(objectives, moneyInfo)
|
Nenue@30
|
312 end
|
Nenue@30
|
313
|
Nenue@30
|
314 -- time limit
|
Nenue@30
|
315 if ( failureTime ) then
|
Nenue@30
|
316 temp_status = temp_status .. '_TIMED'
|
Nenue@30
|
317 if ( timeElapsed and timeElapsed <= failureTime ) then
|
Nenue@30
|
318 timerInfo = {
|
Nenue@30
|
319 type = 'timer',
|
Nenue@30
|
320 finished = false,
|
Nenue@30
|
321 timeElapsed = timeElapsed,
|
Nenue@30
|
322 failureTime = failureTime,
|
Nenue@30
|
323 }
|
Nenue@31
|
324 tinsert(objectives, timerInfo)
|
Nenue@30
|
325 end
|
Nenue@30
|
326 end
|
Nenue@30
|
327 end
|
Nenue@30
|
328 q.moneyInfo = moneyInfo
|
Nenue@30
|
329 q.timerInfo = timerInfo
|
Nenue@30
|
330 q.completionText = completionText
|
Nenue@30
|
331
|
Nenue@30
|
332 -- POI data
|
Nenue@30
|
333 local POI = false
|
Nenue@30
|
334 if ( showPOIs ) then
|
Nenue@30
|
335 POI = {
|
Nenue@30
|
336 questID = questID,
|
Nenue@37
|
337 logIndex = logIndex,
|
Nenue@37
|
338 watchIndex = watchIndex
|
Nenue@30
|
339 }
|
Nenue@30
|
340 local poiButton;
|
Nenue@30
|
341 if ( hasLocalPOI ) then
|
Nenue@30
|
342
|
Nenue@30
|
343 if ( isComplete ) then
|
Nenue@30
|
344 POI.type = 'normal'
|
Nenue@30
|
345 else
|
Nenue@30
|
346 POI.type = 'numeric'
|
Nenue@30
|
347 end
|
Nenue@30
|
348 elseif ( isComplete ) then
|
Nenue@30
|
349 POI.type = 'remote'
|
Nenue@30
|
350 end
|
Nenue@30
|
351
|
Nenue@37
|
352 local distance, onContinent = GetDistanceSqToQuest(logIndex)
|
Nenue@30
|
353 if distance ~= nil and distance > 0 then
|
Nenue@30
|
354 POI.distance = distance
|
Nenue@30
|
355 POI.onContinent = onContinent
|
Nenue@30
|
356 end
|
Nenue@30
|
357 end
|
Nenue@30
|
358 q.POI = POI
|
Nenue@30
|
359
|
Nenue@30
|
360 --- Block Tags
|
Nenue@30
|
361 -- completionTag - in progres, complete, failed, autocomplete
|
Nenue@30
|
362 -- typeTag - account, faction, pvp, dungeon, group
|
Nenue@30
|
363 -- frequencyTag - daily/weekly
|
Nenue@37
|
364 local schema = 'default'
|
Nenue@30
|
365 local questTagID, tagName = GetQuestTagInfo(questID)
|
Nenue@30
|
366 local tagInfo = {}
|
Nenue@30
|
367 local tagCoords = {}
|
Nenue@30
|
368 local factionGroup = GetQuestFactionGroup(questID);
|
Nenue@30
|
369 if( questTagID and questTagID == QUEST_TAG_ACCOUNT ) then
|
Nenue@30
|
370 if( factionGroup ) then
|
Nenue@30
|
371 tagID = "ALLIANCE"
|
Nenue@37
|
372 schema = 'alliance'
|
Nenue@30
|
373 if ( factionGroup == LE_QUEST_FACTION_HORDE ) then
|
Nenue@30
|
374 tagID = "HORDE"
|
Nenue@37
|
375 schema = 'horde'
|
Nenue@30
|
376 end
|
Nenue@30
|
377 isFaction = true
|
Nenue@30
|
378 else
|
Nenue@30
|
379 tagID = QUEST_TAG_ACCOUNT
|
Nenue@30
|
380 isAccount = true
|
Nenue@30
|
381 end
|
Nenue@44
|
382 tagInfo['type'] = QUEST_TAG_TCOORDS[tagID]
|
Nenue@30
|
383 elseif ( factionGroup) then
|
Nenue@30
|
384 tagID = "ALLIANCE"
|
Nenue@30
|
385 if ( factionGroup == LE_QUEST_FACTION_HORDE ) then
|
Nenue@30
|
386 tagID = "HORDE"
|
Nenue@30
|
387 end
|
Nenue@30
|
388 isFaction = true
|
Nenue@44
|
389 tagInfo['type'] = QUEST_TAG_TCOORDS[tagID]
|
Nenue@30
|
390 end
|
Nenue@30
|
391
|
Nenue@30
|
392 if( frequency == LE_QUEST_FREQUENCY_DAILY and (not isComplete or isComplete == 0) ) then
|
Nenue@30
|
393 tagID = 'DAILY'
|
Nenue@44
|
394 tagInfo['frequency'] = QUEST_TAG_TCOORDS[tagID]
|
Nenue@30
|
395 isDaily = true
|
Nenue@37
|
396 schema = 'daily'
|
Nenue@30
|
397 elseif( frequency == LE_QUEST_FREQUENCY_WEEKLY and (not isComplete or isComplete == 0) )then
|
Nenue@30
|
398 tagID = 'WEEKLY'
|
Nenue@44
|
399 tagInfo['frequency'] = QUEST_TAG_TCOORDS[tagID]
|
Nenue@30
|
400 isWeekly = true
|
Nenue@37
|
401 schema = 'weekly'
|
Nenue@30
|
402 elseif( questTagID ) then
|
Nenue@30
|
403 tagID = questTagID
|
Nenue@30
|
404 end
|
Nenue@30
|
405
|
Nenue@30
|
406 if( isComplete ) then
|
Nenue@44
|
407 tagInfo['completion'] = QUEST_TAG_TCOORDS['COMPLETED']
|
Nenue@30
|
408 elseif ( questFailed ) then
|
Nenue@44
|
409 tagInfo['completion'] = QUEST_TAG_TCOORDS['FAILED']
|
Nenue@30
|
410 end
|
Nenue@30
|
411
|
Nenue@30
|
412 q.tagInfo = tagInfo
|
Nenue@44
|
413 q.tagID = tagID -- defining primary tags for compact view
|
Nenue@30
|
414 q.tagName = tagName
|
Nenue@30
|
415
|
Nenue@30
|
416 -- action button information
|
Nenue@37
|
417 local link, icon, charges = GetQuestLogSpecialItemInfo(logIndex)
|
Nenue@37
|
418 local start, duration, enable = GetQuestLogSpecialItemCooldown(logIndex)
|
Nenue@30
|
419 if link or icon or charges then
|
Nenue@30
|
420 q.specialItem = {
|
Nenue@30
|
421 questID = questID,
|
Nenue@37
|
422 logIndex = questLogIndex,
|
Nenue@30
|
423 link = link,
|
Nenue@30
|
424 charges = charges,
|
Nenue@30
|
425 icon = icon,
|
Nenue@30
|
426 start = start,
|
Nenue@30
|
427 duration = duration,
|
Nenue@30
|
428 enable = enable,
|
Nenue@30
|
429 }
|
Nenue@30
|
430 end
|
Nenue@30
|
431
|
Nenue@32
|
432 if moneyInfo or timerInfo then
|
Nenue@32
|
433 numObjectives = #objectives
|
Nenue@32
|
434 end
|
Nenue@30
|
435
|
Nenue@30
|
436 -- raw data
|
Nenue@28
|
437 q.isComplete = isComplete
|
Nenue@28
|
438 q.startEvent = startEvent
|
Nenue@28
|
439 q.isAutoComplete = isAutoComplete
|
Nenue@28
|
440 q.questType = questType
|
Nenue@28
|
441 q.isTask = isTask
|
Nenue@28
|
442 q.isStory = isStory
|
Nenue@28
|
443 q.isOnMap = isOnMap
|
Nenue@28
|
444 q.hasLocalPOI = hasLocalPOI
|
Nenue@28
|
445 q.frequency = frequency
|
Nenue@28
|
446 q.isComplete = isComplete
|
Nenue@28
|
447 q.isStory = isStory
|
Nenue@28
|
448 q.isTask = isTask
|
Nenue@31
|
449 q.statusKey = temp_status
|
Nenue@32
|
450 q.selected = (questID == superTrackQuestID)
|
Nenue@28
|
451
|
Nenue@32
|
452 T.SetRewards(q, questID)
|
Nenue@32
|
453
|
Nenue@34
|
454 q.questID = questID
|
Nenue@37
|
455 q.logIndex = logIndex
|
Nenue@34
|
456 q.watchIndex = watchIndex
|
Nenue@34
|
457 q.id = questID
|
Nenue@37
|
458 q.schema = schema
|
Nenue@28
|
459
|
Nenue@30
|
460 if Devian and Devian.InWorkspace() then
|
Nenue@38
|
461 print('QuestStatus', temp_status, '|cFF00FF00questLogIndex|r:', logIndex, title)
|
Nenue@30
|
462 local temp ={}
|
Nenue@38
|
463 local data_txt = '|cFF'..self.internalColor..'values:|r'
|
Nenue@30
|
464 for k,v in pairs(q) do
|
Nenue@30
|
465 if type(v) =='number' then
|
Nenue@30
|
466 data_txt = data_txt .. ' |cFFFFFF00'..k..'|r: ' .. tostring(v)
|
Nenue@30
|
467 elseif type(v) == 'table' then
|
Nenue@30
|
468 tinsert(temp, k)
|
Nenue@28
|
469 end
|
Nenue@28
|
470 end
|
Nenue@38
|
471 print('DataStatus',data_txt)
|
Nenue@30
|
472 sort(temp, function(a,b) return a < b end)
|
Nenue@30
|
473 for i, k in ipairs(temp) do
|
Nenue@38
|
474 iprint('GetInfo', questID, ''..k..'|r')
|
Nenue@30
|
475 for kk,v in pairs(q[k]) do
|
Nenue@38
|
476 iprint('GetInfo', questID, kk, '=', v)
|
Nenue@30
|
477 end
|
Nenue@28
|
478 end
|
Nenue@28
|
479 end
|
Nenue@28
|
480
|
Nenue@44
|
481 return numEntries
|
Nenue@30
|
482 end
|
Nenue@28
|
483
|
Nenue@37
|
484 Quest.GetObjectives = function(logIndex, numObjectives, isComplete, isSequenced, isStory)
|
Nenue@38
|
485 local print = Quest.print
|
Nenue@30
|
486 local objectives = {}
|
Nenue@39
|
487 if not logIndex then
|
Nenue@39
|
488 return
|
Nenue@39
|
489 end
|
Nenue@39
|
490
|
Nenue@30
|
491 for i = 1, numObjectives do
|
Nenue@37
|
492 local text, type, finished = GetQuestLogLeaderBoard(i, logIndex)
|
Nenue@39
|
493
|
Nenue@39
|
494 local progress = 0
|
Nenue@39
|
495 if finished then
|
Nenue@39
|
496 progress = 1
|
Nenue@39
|
497 elseif text then
|
Nenue@39
|
498 local quantity, maxQuantity = text:match('^(%d+)/(%d+)')
|
Nenue@39
|
499 if quantity and maxQuantity then
|
Nenue@39
|
500 progress = quantity / maxQuantity
|
Nenue@39
|
501 --print('GetObjectives', 'calculated objective progress:', quantity, '/', maxQuantity, '=', progress)
|
Nenue@39
|
502 end
|
Nenue@39
|
503 end
|
Nenue@39
|
504
|
Nenue@39
|
505 print('GetObjectives', format('|cFF88FF88#%d %s %s %s', i, tostring(type), tostring(text), tostring(finished)), '('.. tostring(progress)..')')
|
Nenue@39
|
506
|
Nenue@39
|
507
|
Nenue@30
|
508 objectives[i] = {
|
Nenue@28
|
509 index = i,
|
Nenue@28
|
510 type = type,
|
Nenue@28
|
511 text = text,
|
Nenue@39
|
512 finished = finished,
|
Nenue@39
|
513 progress = progress
|
Nenue@28
|
514 }
|
Nenue@28
|
515 end
|
Nenue@30
|
516 return objectives
|
Nenue@28
|
517 end
|
Nenue@28
|
518
|
Nenue@30
|
519 local huge, sqrt = math.huge, math.sqrt
|
Nenue@28
|
520 Quest.GetClosest = function()
|
Nenue@28
|
521 local minID, minTitle
|
Nenue@30
|
522 local minDist = huge
|
Nenue@28
|
523 local numQuests = GetNumQuestLogEntries()
|
Nenue@28
|
524 for questIndex = 1, numQuests do
|
Nenue@28
|
525 local distance, onContinent = GetDistanceSqToQuest(questIndex)
|
Nenue@28
|
526 local title, level, _, _, _, _, _, _, questID = GetQuestLogTitle(questIndex)
|
Nenue@28
|
527 if onContinent and distance < minDist then
|
Nenue@28
|
528 minDist = distance
|
Nenue@28
|
529 minTitle = title
|
Nenue@28
|
530 minID = questID
|
Nenue@28
|
531 end
|
Nenue@28
|
532 end
|
Nenue@28
|
533
|
Nenue@30
|
534 print('nearest quest is', minTitle, 'by', sqrt(minDist))
|
Nenue@28
|
535 return minID, minTitle, minDist
|
Nenue@28
|
536 end
|
Nenue@28
|
537
|
Nenue@28
|
538 Quest.OnTurnIn = function(self, questID, xp, money)
|
Nenue@28
|
539 end
|
Nenue@28
|
540
|
Nenue@29
|
541 Quest.Select = function (handler, block)
|
Nenue@29
|
542 if block.info.isAutoComplete and block.info.isComplete then
|
Nenue@34
|
543 ShowQuestComplete(block.info.logIndex)
|
Nenue@28
|
544 else
|
Nenue@29
|
545 SetSuperTrackedQuestID(block.info.questID)
|
Nenue@28
|
546 end
|
Nenue@28
|
547 end
|
Nenue@28
|
548
|
Nenue@29
|
549 Quest.Link = function(handler, block)
|
Nenue@34
|
550 local questLink = GetQuestLink(block.info.logIndex);
|
Nenue@28
|
551 if ( questLink ) then
|
Nenue@28
|
552 ChatEdit_InsertLink(questLink);
|
Nenue@28
|
553 end
|
Nenue@28
|
554 end
|
Nenue@28
|
555
|
Nenue@29
|
556 Quest.Open = function(handler, block)
|
Nenue@29
|
557 QuestMapFrame_OpenToQuestDetails(block.info.questID)
|
Nenue@28
|
558 end
|
Nenue@28
|
559
|
Nenue@29
|
560 Quest.Remove = function(handler, block)
|
Nenue@34
|
561 print('removing', block.info.logIndex, 'from watcher')
|
Nenue@34
|
562 RemoveQuestWatch(block.info.logIndex)
|
Nenue@29
|
563 end
|