Mercurial > wow > buffalo2
comparison ObjectiveTracker/QuestTracker.lua @ 23:e837384ac363
Separating objective tracker module
author | Nenue |
---|---|
date | Sun, 10 Apr 2016 04:35:32 -0400 |
parents | |
children | 66b927b46776 |
comparison
equal
deleted
inserted
replaced
22:9b3fa734abff | 23:e837384ac363 |
---|---|
1 local B = select(2,...).frame | |
2 local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') | |
3 local _G, ipairs, max, min, unpack, floor, pairs, tostring, type, band = _G, ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band | |
4 local GetAutoQuestPopUp, GetQuestLogCompletionText = GetAutoQuestPopUp, GetQuestLogCompletionText | |
5 local Default, Quest = T.DefaultHandler, T.Quest | |
6 local format = format | |
7 local print = B.print('Tracker') | |
8 local lprint = B.print('Line') | |
9 | |
10 local colors = T.colors | |
11 Quest.UpdateObjectives = function(handler, block) | |
12 local print = lprint | |
13 print('|cFF00FFFFUpdateObjectives()') | |
14 local info = block.info | |
15 | |
16 local titlebg, textbg = colors.default.titlebg, colors.default.textbg | |
17 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) | |
18 | |
19 if info.isAccount then | |
20 if info.isFaction then | |
21 print(' faction', info.tagID) | |
22 titlebg, textbg = colors['faction_'..info.tagID].titlebg, colors.default.textbg | |
23 else | |
24 print(' account', info.isAccount, info.isFaction) | |
25 titlebg, textbg = colors.account.titlebg, colors.account.textbg | |
26 end | |
27 elseif info.isDaily then | |
28 print(' daily', info.frequency) | |
29 titlebg, textbg = colors.daily.titlebg, colors.daily.textbg | |
30 elseif info.isWeekly then | |
31 print(' weekly', info.frequency) | |
32 titlebg, textbg = colors.weekly.titlebg, colors.weekly.textbg | |
33 end | |
34 | |
35 block.titlebg:SetGradientAlpha(unpack(titlebg)) | |
36 block.statusbg:SetGradientAlpha(unpack(textbg)) | |
37 | |
38 local completionText | |
39 if info.isAutoComplete then | |
40 local questID, popupType = GetAutoQuestPopUp(info.questLogIndex) | |
41 if popupType == 'COMPLETE' then | |
42 print(' :: auto-complete quest :: set the message') | |
43 info.completionText = CLICK_TO_COMPLETE | |
44 end | |
45 end | |
46 if info.isComplete then | |
47 if not completionText or info.completionText then | |
48 info.completionText = GetQuestLogCompletionText(info.questLogIndex) | |
49 end | |
50 print(' :: complete quest :: show instruction: "'.. tostring(info.completionText) .. '"') | |
51 end | |
52 | |
53 Default.UpdateObjectives(handler, block) | |
54 end | |
55 | |
56 Quest.UpdateLine = function(handler, block, line, data) | |
57 local print = lprint | |
58 local objectiveType = data.type | |
59 local r, g, b, a = 0, 1, 1, 1 | |
60 | |
61 line.progress = 0 | |
62 if data.finished then | |
63 line.progress = 2 | |
64 r, g, b, a = 0, 1, 0, 1 | |
65 elseif objectiveType == 'monster' then | |
66 r, g, b, a = 1, .55, .2, 1 | |
67 elseif objectiveType == 'item' then | |
68 r, g, b, a = .8, .8, .8, 1 | |
69 elseif objectiveType == 'object' then | |
70 r, g, b, a = 1, 1, 1, 1 | |
71 elseif objectiveType == 'player' then | |
72 r, g, b, a = 0, 0.8, 1, 1 | |
73 end | |
74 print(format(' |cFF%02X%02X%02X%0.1f, %0.1f, %0.1f|r', (r * 255), g * 255, b * 255, r, g, b)) | |
75 | |
76 line.displayColor = {r, g, b, a} | |
77 line.status:SetTextColor(r, g, b, a) | |
78 line.displayText = data.text | |
79 | |
80 return line | |
81 end | |
82 | |
83 ----------------------------- | |
84 --- QUEST | |
85 Quest.itemButtons = {} | |
86 Quest.freeButtons = {} | |
87 Quest.POI = {} | |
88 Quest.QuestBlock = {} | |
89 Quest.LogBlock = {} | |
90 Quest.LogInfo = {} | |
91 | |
92 function Quest:GetNumWatched () | |
93 print(self.name, self) | |
94 self.numAll = GetNumQuestLogEntries() | |
95 self.numWatched = GetNumQuestWatches() | |
96 return self.numWatched, self.numAll | |
97 end | |
98 Quest.GetInfo = function (self, watchIndex) | |
99 print('|cFF00DDFFQuest|r.|cFF0088FFGetInfo(|r'.. tostring(watchIndex)..'|r)') | |
100 local questID, title, questIndex, numObjectives, requiredMoney, isComplete, | |
101 startEvent, isAutoComplete, failureTime, timeElapsed, questType, isTask, isStory, isOnMap, hasLocalPOI = GetQuestWatchInfo(watchIndex) | |
102 | |
103 if not questIndex then | |
104 return | |
105 end | |
106 | |
107 local _, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, _, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(questIndex) | |
108 | |
109 | |
110 if not questID then | |
111 return | |
112 end | |
113 Quest.Info[questID] = Quest.Info[questID] or {} | |
114 | |
115 local q = Quest.Info[questID] | |
116 q.watchIndex = watchIndex | |
117 q.type = 'Quest' | |
118 q.questID = questID | |
119 q.title = title | |
120 q.level = level | |
121 q.displayQuestID = displayQuestID | |
122 q.suggestedGroup = suggestedGroup | |
123 q.questLogIndex = questIndex | |
124 q.numObjectives = numObjectives | |
125 q.requiredMoney = requiredMoney | |
126 q.isComplete = isComplete | |
127 q.startEvent = startEvent | |
128 q.isAutoComplete = isAutoComplete | |
129 q.failureTime = failureTime | |
130 q.timeElapsed = timeElapsed | |
131 q.questType = questType | |
132 q.isTask = isTask | |
133 q.isStory = isStory | |
134 q.isOnMap = isOnMap | |
135 q.hasLocalPOI = hasLocalPOI | |
136 q.frequency = frequency | |
137 q.isComplete = isComplete | |
138 q.isStory = isStory | |
139 q.isTask = isTask | |
140 | |
141 --- resolve icon type and template | |
142 local questTagID, tagName = GetQuestTagInfo(questID) | |
143 local tagID | |
144 | |
145 local factionGroup = GetQuestFactionGroup(questID); | |
146 if( questTagID and questTagID == QUEST_TAG_ACCOUNT ) then | |
147 if( factionGroup ) then | |
148 tagID = "ALLIANCE"; | |
149 if ( factionGroup == LE_QUEST_FACTION_HORDE ) then | |
150 tagID = "HORDE"; | |
151 end | |
152 q.isFaction = true | |
153 else | |
154 tagID = QUEST_TAG_ACCOUNT; | |
155 q.isAccount = true | |
156 end | |
157 q.typeTag = QUEST_TAG_TCOORDS[tagID] | |
158 elseif ( factionGroup) then | |
159 tagID = "ALLIANCE"; | |
160 if ( factionGroup == LE_QUEST_FACTION_HORDE ) then | |
161 tagID = "HORDE"; | |
162 end | |
163 q.isFaction = true | |
164 end | |
165 | |
166 if( frequency == LE_QUEST_FREQUENCY_DAILY and (not isComplete or isComplete == 0) ) then | |
167 tagID = "DAILY"; | |
168 q.frequencyTag = QUEST_TAG_TCOORDS["DAILY"] | |
169 q.isDaily = true | |
170 elseif( frequency == LE_QUEST_FREQUENCY_WEEKLY and (not isComplete or isComplete == 0) )then | |
171 tagID = "WEEKLY"; | |
172 q.frequencyTag = QUEST_TAG_TCOORDS["WEEKLY"] | |
173 q.isWeekly = true | |
174 elseif( questTagID ) then | |
175 tagID = questTagID; | |
176 end | |
177 | |
178 if ( isComplete and isComplete < 0 ) then | |
179 q.completionTag = QUEST_TAG_TCOORDS["FAILED"] | |
180 q.isFailed = true | |
181 elseif isComplete then | |
182 q.completionTag = QUEST_TAG_TCOORDS["COMPLETED"] | |
183 end | |
184 | |
185 | |
186 q.tagID = questTagID | |
187 q.tagName = tagName | |
188 | |
189 | |
190 | |
191 --q.isBreadCrumb = isBreadCrumb | |
192 q.completionText= GetQuestLogCompletionText(questIndex) | |
193 q.numObjectives = GetNumQuestLeaderBoards(questIndex) | |
194 q.objectives = {} | |
195 for i = 1, q.numObjectives do | |
196 local text, type, finished = GetQuestLogLeaderBoard(i, questIndex) | |
197 print(format(' #%d %s %s %s', i, tostring(type), tostring(text), tostring(finished))) | |
198 q.objectives[i] = { | |
199 index = i, | |
200 type = type, | |
201 text = text, | |
202 finished = finished | |
203 } | |
204 if type == 'event' then | |
205 elseif type == 'monster' then | |
206 elseif type == 'object' then | |
207 elseif type == 'reputation' then | |
208 elseif type == 'item' then | |
209 end | |
210 end | |
211 | |
212 if requiredMoney >= 1 then | |
213 local money = GetMoney() | |
214 local moneyText = money | |
215 local requiredSilver, requiredCopper | |
216 local requiredGold = (requiredMoney > 10000) and (floor(requiredMoney/10000)) or nil | |
217 if mod(requiredMoney, 10000) ~= 0 then | |
218 requiredSilver = (requiredMoney > 100) and (mod(requiredMoney, 10000) / 100) or nil | |
219 if mod(requiredMoney, 100) ~= 0 then | |
220 requiredCopper = mod(requiredMoney, 100) | |
221 end | |
222 end | |
223 | |
224 -- round the money value down | |
225 if requiredMoney > 9999 and not (requiredSilver or requiredCopper) then | |
226 moneyText = floor(money/10000) | |
227 elseif requiredMoney < 10000 and mod(requiredMoney,100) == 0 then | |
228 moneyText = floor(money/100) | |
229 end | |
230 | |
231 local text = moneyText | |
232 local index = #q.objectives + 1 | |
233 local finished = (GetMoney() >= requiredMoney) | |
234 | |
235 if not finished then | |
236 text = text .. ' / ' .. GetCoinTextureString(requiredMoney, 12) | |
237 else | |
238 text = '' .. GetCoinTextureString(requiredMoney, 12) | |
239 end | |
240 q.objectives[index] = { | |
241 index = index, | |
242 type = 'progressbar', | |
243 quantity = money, | |
244 requiredQuantity = requiredMoney, | |
245 text = text, | |
246 finished = finished | |
247 } | |
248 print(format(' #%d %s %s %s', index, 'money', text, tostring(finished))) | |
249 end | |
250 | |
251 | |
252 local link, icon, charges = GetQuestLogSpecialItemInfo(questIndex) | |
253 local start, duration, enable = GetQuestLogSpecialItemCooldown(questIndex) | |
254 if link or icon or charges then | |
255 q.specialItem = { | |
256 questID = questID, | |
257 questIndex = questIndex, | |
258 link = link, | |
259 charges = charges, | |
260 icon = icon, | |
261 start = start, | |
262 duration = duration, | |
263 enable = enable, | |
264 } | |
265 end | |
266 | |
267 if QuestHasPOIInfo(questID) then | |
268 local distance, onContinent = GetDistanceSqToQuest(questIndex) | |
269 if distance ~= nil and distance > 0 then | |
270 self.POI[questIndex] = { | |
271 questIndex = questIndex, | |
272 questID = questID, | |
273 distance = distance, | |
274 onContinent = onContinent | |
275 } | |
276 end | |
277 end | |
278 | |
279 | |
280 q.selected = (questID == GetSuperTrackedQuestID()) -- call directly so artifact data doesn't become an issue | |
281 self.WatchInfo[watchIndex] = q | |
282 self.LogInfo[questIndex] = q | |
283 print('- logIndex =', questIndex, 'title =', title) | |
284 return q | |
285 end | |
286 | |
287 Quest.GetClosest = function() | |
288 local minID, minTitle | |
289 local minDist = math.huge | |
290 local numQuests = GetNumQuestLogEntries() | |
291 for questIndex = 1, numQuests do | |
292 local distance, onContinent = GetDistanceSqToQuest(questIndex) | |
293 local title, level, _, _, _, _, _, _, questID = GetQuestLogTitle(questIndex) | |
294 if onContinent and distance < minDist then | |
295 minDist = distance | |
296 minTitle = title | |
297 minID = questID | |
298 end | |
299 end | |
300 | |
301 print('nearest quest is', minTitle, 'by', math.sqrt(minDist)) | |
302 return minID, minTitle, minDist | |
303 end | |
304 | |
305 Quest.OnTurnIn = function(self, questID, xp, money) | |
306 | |
307 end |