Nenue@28
|
1 --- ${PACKAGE_NAME}
|
Nenue@28
|
2 -- @file-author@
|
Nenue@28
|
3 -- @project-revision@ @project-hash@
|
Nenue@28
|
4 -- @file-revision@ @file-hash@
|
Nenue@28
|
5 -- Created: 3/26/2016 1:51 AM
|
Nenue@28
|
6 local B, _G = select(2,...).frame, _G
|
Nenue@28
|
7 local pairs, setmetatable, type, tostring, band, format = _G.pairs, _G.setmetatable, _G.type, _G.tostring, bit.band, string.format
|
Nenue@28
|
8 local ipairs, tinsert, hooksecurefunc = _G.ipairs, _G.tinsert, _G.hooksecurefunc
|
Nenue@28
|
9 local PlaySoundFile, IsQuestTask, SortQuestWatches, GetCurrentMapAreaID, GetZoneText, GetMinimapZoneText = PlaySoundFile, IsQuestTask, SortQuestWatches, GetCurrentMapAreaID, GetZoneText, GetMinimapZoneText
|
Nenue@28
|
10 local QuestPOIUpdateIcons, GetCVar, IsPlayerInMicroDungeon, WorldMapFrame, GetCVarBool, SetMapToCurrentZone = QuestPOIUpdateIcons, GetCVar, IsPlayerInMicroDungeon, WorldMapFrame, GetCVarBool, SetMapToCurrentZone
|
Nenue@28
|
11 local AddAutoQuestPopUp = AddAutoQuestPopUp
|
Nenue@28
|
12 local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
|
Nenue@28
|
13 local print = B.print('Objectives')
|
Nenue@28
|
14 local ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame = _G.ObjectiveTrackerFrame, _G.VeneerObjectiveScroll, _G.CreateFrame
|
Nenue@28
|
15 local Wrapper = _G.VeneerObjectiveWrapper
|
Nenue@28
|
16 local Scroller = VeneerObjectiveWrapper.scrollArea
|
Nenue@28
|
17 local Scroll = _G.VeneerObjectiveScroll
|
Nenue@28
|
18 local unitLevel = UnitLevel('player')
|
Nenue@28
|
19
|
Nenue@28
|
20 --- Performance values
|
Nenue@28
|
21
|
Nenue@44
|
22 --- Done once per ui load
|
Nenue@44
|
23 local BlizzHooks = {
|
Nenue@44
|
24 'AcceptQuest',
|
Nenue@44
|
25 'AddQuestWatch',
|
Nenue@45
|
26 'CompleteQuest',
|
Nenue@44
|
27 'RemoveQuestWatch',
|
Nenue@44
|
28 'AbandonQuest',
|
Nenue@44
|
29 'AcknowledgeAutoAcceptQuest',
|
Nenue@44
|
30 'AddAutoQuestPopUp',
|
Nenue@44
|
31 'RemoveAutoQuestPopUp',
|
Nenue@44
|
32 'AddTrackedAchievement',
|
Nenue@44
|
33 'RemoveTrackedAchievement',
|
Nenue@44
|
34 'SetSuperTrackedQuestID',
|
Nenue@44
|
35 'SelectQuestLogEntry',
|
Nenue@44
|
36 }
|
Nenue@44
|
37 local enabledOnly = {
|
Nenue@44
|
38 ['AddQuestWatch'] = true,
|
Nenue@44
|
39 }
|
Nenue@28
|
40
|
Nenue@28
|
41 --- These are the bitfields used by Blizzard_ObjectiveTracker to determine which segments get parsed.
|
Nenue@28
|
42 --- They are replicated here so that plugins can make use of any securehook args involving this info.
|
Nenue@28
|
43 local OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST -- 0x0100
|
Nenue@28
|
44 local OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP = OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP -- 0x0200
|
Nenue@28
|
45 local OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE -- 0x0400
|
Nenue@28
|
46 local OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO = OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO -- 0x0800
|
Nenue@28
|
47 local OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT = OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT -- 0x1000
|
Nenue@28
|
48
|
Nenue@28
|
49
|
Nenue@28
|
50 local OBJECTIVE_TRACKER_UPDATE_STATIC = OBJECTIVE_TRACKER_UPDATE_STATIC -- 0x0000
|
Nenue@28
|
51 local OBJECTIVE_TRACKER_UPDATE_ALL = OBJECTIVE_TRACKER_UPDATE_ALL -- 0xFFFF
|
Nenue@28
|
52 local OBJECTIVE_TRACKER_UPDATE_ID = OBJECTIVE_TRACKER_UPDATE_ID -- 0
|
Nenue@28
|
53
|
Nenue@28
|
54 local OBJECTIVE_TRACKER_UPDATE_QUEST = OBJECTIVE_TRACKER_UPDATE_QUEST -- 0x0001
|
Nenue@28
|
55 local OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED = OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED -- 0x0002
|
Nenue@28
|
56 local OBJECTIVE_TRACKER_UPDATE_TASK_ADDED = OBJECTIVE_TRACKER_UPDATE_TASK_ADDED -- 0x0004
|
Nenue@28
|
57 local OBJECTIVE_TRACKER_UPDATE_SCENARIO = OBJECTIVE_TRACKER_UPDATE_SCENARIO -- 0x0008
|
Nenue@28
|
58 local OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE = OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE -- 0x0010
|
Nenue@28
|
59 local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT -- 0x0020
|
Nenue@28
|
60 local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED -- 0x0040
|
Nenue@28
|
61 local OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED = OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED -- 0x0080
|
Nenue@28
|
62
|
Nenue@28
|
63 local OBJECTIVE_TRACKER_UPDATE_REASON = OBJECTIVE_TRACKER_UPDATE_ALL -- default
|
Nenue@28
|
64 --- Used to determine which trackers are listening for money events
|
Nenue@28
|
65
|
Nenue@28
|
66 T.strings = {}
|
Nenue@28
|
67 T.strings.CLICK_TO_ACCCEPT = 'Click to Accept'
|
Nenue@28
|
68 T.strings.CLICK_TO_COMPLETE = 'Click to complete'
|
Nenue@28
|
69 T.colors ={
|
Nenue@28
|
70 enable = true,
|
Nenue@28
|
71 }
|
Nenue@28
|
72
|
Nenue@28
|
73 T.watchMoneyReasons = 0
|
Nenue@28
|
74
|
Nenue@28
|
75 --- Baseline defaults table; values defined in the files that they pertain to
|
Nenue@28
|
76 T.defaults = {}
|
Nenue@28
|
77
|
Nenue@34
|
78
|
Nenue@28
|
79 --- Tracker display order
|
Nenue@28
|
80 T.orderedNames = {'Bonus', 'AutoQuest', 'Quest', 'Cheevs'}
|
Nenue@28
|
81
|
Nenue@28
|
82 --- ipairs() argument tables
|
Nenue@28
|
83 T.orderedHandlers = setmetatable({}, {__mode = "k"})
|
Nenue@28
|
84 T.orderedTrackers = setmetatable({}, {__mode = "k"})
|
Nenue@28
|
85 T.indexedTrackers = setmetatable({}, {__mode = "k"})
|
Nenue@28
|
86
|
Nenue@28
|
87 --- pairs() argument tables
|
Nenue@28
|
88 T.namedTrackers = setmetatable({}, {__mode = "k"})
|
Nenue@28
|
89
|
Nenue@28
|
90 local WRAPPER_ANCHOR_POINT = 'TOPRIGHT'
|
Nenue@28
|
91 local WRAPPER_OFFSET_X = 0
|
Nenue@28
|
92 local WRAPPER_OFFSET_Y = -200
|
Nenue@28
|
93 local WRAPPER_MAX_HEIGHT = 670
|
Nenue@28
|
94 local WRAPPER_WIDTH = 280
|
Nenue@28
|
95 local WRAPPER_HEADER_HEIGHT = 24
|
Nenue@28
|
96
|
Nenue@28
|
97 T.defaults.Wrapper = {
|
Nenue@28
|
98 AnchorPoint = WRAPPER_ANCHOR_POINT,
|
Nenue@28
|
99 OffsetX = WRAPPER_OFFSET_X,
|
Nenue@28
|
100 OffsetY = WRAPPER_OFFSET_Y,
|
Nenue@28
|
101 Height = WRAPPER_MAX_HEIGHT,
|
Nenue@28
|
102 Width = WRAPPER_WIDTH,
|
Nenue@28
|
103 HeaderHeight = WRAPPER_HEADER_HEIGHT,
|
Nenue@28
|
104 TextSpacing = 3,
|
Nenue@33
|
105 TextIndent = 4,
|
Nenue@28
|
106 TitleSpacing = 3,
|
Nenue@33
|
107 TitleIndent = 4,
|
Nenue@28
|
108 }
|
Nenue@28
|
109
|
Nenue@28
|
110
|
Nenue@28
|
111
|
Nenue@28
|
112 --- Tracker module definitions begin here; innards dealing with data retreival and output are defined further in
|
Nenue@28
|
113 T.DefaultHandler = {
|
Nenue@28
|
114 previousHeight = 0,
|
Nenue@28
|
115
|
Nenue@28
|
116 name = "temp",
|
Nenue@28
|
117 displayName = "temp",
|
Nenue@28
|
118 updateReasonModule = 0xFF00,
|
Nenue@28
|
119 updateReasonEvent = 0x00FF,
|
Nenue@28
|
120
|
Nenue@28
|
121 numWatched = 0, --- number of entries being handled
|
Nenue@28
|
122 numBlocks = 0, --- number of blocks created
|
Nenue@28
|
123 actualBlocks = 0, --- number of blocks in use
|
Nenue@34
|
124 Info = {}, --- stored watch list information, keyed by whatever unique ID is involved for that tracker
|
Nenue@34
|
125 Watched = {}, --- stores whether the given unique ID is tracked
|
Nenue@28
|
126
|
Nenue@34
|
127 freeBlocks = {}, --- blocks hidden due to list shrinkage
|
Nenue@34
|
128 usedBlocks = {}, --- block in use
|
Nenue@34
|
129 BlockInfo = {}, --- by block creation offset, used by framescript
|
Nenue@37
|
130 WatchList = {}, --- ordered manifest of watched items
|
Nenue@28
|
131
|
Nenue@34
|
132 --- Indexes
|
Nenue@37
|
133 InfoBlock = {}, --- by unique ID
|
Nenue@34
|
134 LogBlock = {}, --- by API log offset, used by GetBlock if possible
|
Nenue@34
|
135 WatchBlock = {}, --- block by internal offset, used in GetBlock scope
|
Nenue@34
|
136 WatchInfo = {}, --- info by internal offset, used in Update scope
|
Nenue@28
|
137 }
|
Nenue@28
|
138
|
Nenue@28
|
139 T.AutoQuest = {
|
Nenue@28
|
140 name = "AutoQuest",
|
Nenue@28
|
141 displayName = "Notice",
|
Nenue@28
|
142 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST,
|
Nenue@28
|
143 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST + OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED,
|
Nenue@38
|
144 internalColor = '00FFFF',
|
Nenue@29
|
145 LogInfo = {},
|
Nenue@29
|
146 QuestBlock = {},
|
Nenue@28
|
147 }
|
Nenue@28
|
148 T.Quest = {
|
Nenue@28
|
149 name = "Quest",
|
Nenue@28
|
150 displayName = "Quests",
|
Nenue@28
|
151 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST,
|
Nenue@28
|
152 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST + OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED,
|
Nenue@38
|
153 internalColor = '0088FF',
|
Nenue@28
|
154 itemButtons = {},
|
Nenue@28
|
155 freeButtons = {},
|
Nenue@29
|
156 LogInfo = {},
|
Nenue@29
|
157 QuestBlock = {},
|
Nenue@28
|
158 }
|
Nenue@28
|
159 T.Cheevs = {
|
Nenue@28
|
160 name = "Cheevs",
|
Nenue@28
|
161 displayName = "Achievements",
|
Nenue@37
|
162 schema = 'achievement',
|
Nenue@28
|
163 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT,
|
Nenue@28
|
164 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT +
|
Nenue@28
|
165 OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED,
|
Nenue@38
|
166 internalColor = '00FF88',
|
Nenue@28
|
167 }
|
Nenue@28
|
168 T.Bonus = {
|
Nenue@28
|
169 name = "Bonus",
|
Nenue@28
|
170 displayName = "Bonus Objectives",
|
Nenue@28
|
171 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE,
|
Nenue@29
|
172 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST + OBJECTIVE_TRACKER_UPDATE_TASK_ADDED,
|
Nenue@38
|
173 internalColor = '00FF00',
|
Nenue@29
|
174 QuestBlock = {},
|
Nenue@28
|
175 }
|
Nenue@28
|
176
|
Nenue@28
|
177 T.Scenario = {
|
Nenue@28
|
178 name = 'Scenario',
|
Nenue@28
|
179 displayName = 'Scenario Objectives',
|
Nenue@28
|
180 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO,
|
Nenue@38
|
181 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE + OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED,
|
Nenue@38
|
182 internalColor = '88FF00',
|
Nenue@28
|
183 }
|
Nenue@38
|
184 local lastLabel
|
Nenue@38
|
185 local Tracker_debug = function(handler, channel)
|
Nenue@38
|
186 local func = B.print(channel)
|
Nenue@38
|
187 local color = handler.internalColor
|
Nenue@38
|
188 return function(label, ...)
|
Nenue@38
|
189 if lastLabel == label then
|
Nenue@38
|
190 label = label:gsub('%a', ' ').. ' '
|
Nenue@38
|
191 else
|
Nenue@38
|
192 lastLabel = label
|
Nenue@38
|
193 label = '|cFF'..color..label..':|r'
|
Nenue@38
|
194 end
|
Nenue@38
|
195 func(label, ...)
|
Nenue@38
|
196 end
|
Nenue@38
|
197 end
|
Nenue@28
|
198 local Tracker_string = function (self)
|
Nenue@28
|
199 return self.name
|
Nenue@28
|
200 end
|
Nenue@28
|
201 local Tracker_call = function (self, reason)
|
Nenue@28
|
202 self:Update(reason)
|
Nenue@28
|
203 end
|
Nenue@28
|
204 local Handler_Initialize = function (self, name, index)
|
Nenue@28
|
205 local c = T.Conf.Wrapper
|
Nenue@28
|
206 print('Initializing |cFF00FFFF'..name..'|r module...')
|
Nenue@28
|
207
|
Nenue@28
|
208 local handler = setmetatable(T[name] or {}, {
|
Nenue@28
|
209 __tostring = Tracker_string,
|
Nenue@28
|
210 __call = Tracker_call
|
Nenue@28
|
211 })
|
Nenue@28
|
212 if type(T.orderedHandlers[index]) == 'table' then
|
Nenue@28
|
213 return T.orderedHandlers[index]
|
Nenue@28
|
214 end
|
Nenue@28
|
215
|
Nenue@28
|
216 print('|cFFFFFF00Acquiring locals')
|
Nenue@28
|
217 local preset = {}
|
Nenue@28
|
218 for k, _ in pairs(handler) do
|
Nenue@28
|
219 preset[k] = true
|
Nenue@28
|
220 end
|
Nenue@28
|
221
|
Nenue@28
|
222
|
Nenue@28
|
223 print('|cFFFF8800Inheriting')
|
Nenue@28
|
224 for k, v in pairs(self) do
|
Nenue@28
|
225 if not handler[k] then
|
Nenue@28
|
226 if type(v) == 'table' then
|
Nenue@28
|
227 -- assume all tables to be local data; don't inherit or ref
|
Nenue@28
|
228 handler[k] = {}
|
Nenue@28
|
229 else
|
Nenue@28
|
230 handler[k] = self[k]
|
Nenue@28
|
231 end
|
Nenue@28
|
232 print('copying', k)
|
Nenue@28
|
233 end
|
Nenue@28
|
234 end
|
Nenue@28
|
235 print('|cFFFF4400'..tostring(name)..'|r:')
|
Nenue@28
|
236 for k, v in pairs(handler) do
|
Nenue@28
|
237 print(format("%32s %8s %s", (preset[k] and '|cFFFFFFFF' or '|cFFFFFF00') .. k .. '|r', type(v), tostring(v)))
|
Nenue@28
|
238 end
|
Nenue@28
|
239
|
Nenue@28
|
240 T[name] = handler
|
Nenue@28
|
241
|
Nenue@28
|
242 local trackerName = 'Veneer'..name..'Tracker'
|
Nenue@28
|
243 local handler = T[name]
|
Nenue@28
|
244 local frame = CreateFrame('Frame', trackerName, _G.VeneerObjectiveScroll, 'VeneerTrackerTemplate')
|
Nenue@28
|
245 frame.title:SetText(handler.displayName)
|
Nenue@28
|
246 frame:SetWidth(c.Width)
|
Nenue@30
|
247 frame.previousOffset = 0
|
Nenue@29
|
248
|
Nenue@28
|
249 handler.frame = frame
|
Nenue@29
|
250 handler.numBlocks = 0
|
Nenue@29
|
251 handler.actualBlocks = 0
|
Nenue@28
|
252 handler.trackerName = trackerName
|
Nenue@28
|
253 handler.lines = {}
|
Nenue@28
|
254 T.orderedTrackers[index] = frame
|
Nenue@28
|
255 T.namedTrackers[name] = frame
|
Nenue@28
|
256 T.indexedTrackers[handler] = frame
|
Nenue@28
|
257 print('|cFFFF0088' .. trackerName .. '|r created for |cFF00FFFF' .. handler.displayName .. '|r module')
|
Nenue@28
|
258
|
Nenue@38
|
259 handler.print = Tracker_debug(handler, 'Tracker')
|
Nenue@38
|
260 handler.lprint = Tracker_debug(handler, 'Line')
|
Nenue@38
|
261 handler.bprint = Tracker_debug(handler, 'Block')
|
Nenue@38
|
262
|
Nenue@28
|
263 T.orderedHandlers[index] = handler
|
Nenue@28
|
264 return true
|
Nenue@28
|
265 end
|
Nenue@28
|
266
|
Nenue@28
|
267 local Event = {}
|
Nenue@39
|
268
|
Nenue@28
|
269 Event.QUEST_LOG_UPDATE = function()
|
Nenue@39
|
270 return OBJECTIVE_TRACKER_UPDATE_QUEST
|
Nenue@28
|
271 end
|
Nenue@30
|
272 local GetNumQuestWatches, AddQuestWatch, SetSuperTrackedQuestID = GetNumQuestWatches, AddQuestWatch, SetSuperTrackedQuestID
|
Nenue@30
|
273 Event.QUEST_ACCEPTED = function(questLogIndex, questID, added)
|
Nenue@45
|
274
|
Nenue@45
|
275 --todo: stall non-confirmed autoquests
|
Nenue@45
|
276 AddQuestWatch(questLogIndex)
|
Nenue@28
|
277 if ( IsQuestTask(questID) ) then
|
Nenue@38
|
278 return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED + OBJECTIVE_TRACKER_UPDATE_TASK_ADDED, questID, added
|
Nenue@28
|
279 else
|
Nenue@38
|
280 return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added
|
Nenue@28
|
281 end
|
Nenue@28
|
282 end
|
Nenue@28
|
283
|
Nenue@28
|
284 Event.QUEST_WATCH_LIST_CHANGED = function(questID, added)
|
Nenue@37
|
285 if ( added == true ) then
|
Nenue@28
|
286 if ( not IsQuestTask(questID) ) then
|
Nenue@28
|
287 return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added
|
Nenue@28
|
288 end
|
Nenue@37
|
289 elseif questID then
|
Nenue@37
|
290 return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added
|
Nenue@38
|
291 else
|
Nenue@38
|
292 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST
|
Nenue@28
|
293 end
|
Nenue@28
|
294 end
|
Nenue@28
|
295
|
Nenue@28
|
296 Event.QUEST_POI_UPDATE = function()
|
Nenue@28
|
297 QuestPOIUpdateIcons();
|
Nenue@28
|
298 if ( GetCVar("trackQuestSorting") == "proximity" ) then
|
Nenue@28
|
299 SortQuestWatches();
|
Nenue@28
|
300 end
|
Nenue@28
|
301 return OBJECTIVE_TRACKER_UPDATE_ALL
|
Nenue@28
|
302 end
|
Nenue@37
|
303 Event.SUPER_TRACKED_QUEST_CHANGED = function(questID)
|
Nenue@44
|
304 --return OBJECTIVE_TRACKER_UPDATE_QUEST, questID
|
Nenue@28
|
305 end
|
Nenue@28
|
306 Event.ZONE_CHANGED = function()
|
Nenue@28
|
307 local inMicroDungeon = IsPlayerInMicroDungeon();
|
Nenue@28
|
308 if ( inMicroDungeon ~= T.inMicroDungeon ) then
|
Nenue@28
|
309 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
|
Nenue@28
|
310 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker
|
Nenue@28
|
311 end
|
Nenue@28
|
312 --SortQuestWatches();
|
Nenue@28
|
313 T.inMicroDungeon = inMicroDungeon;
|
Nenue@28
|
314 end
|
Nenue@33
|
315 return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE + OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO
|
Nenue@28
|
316 end
|
Nenue@28
|
317 Event.QUEST_AUTOCOMPLETE = function(questId)
|
Nenue@28
|
318 AddAutoQuestPopUp(questId, "COMPLETE");
|
Nenue@28
|
319 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP
|
Nenue@28
|
320 end
|
Nenue@28
|
321 Event.SCENARIO_CRITERIA_UPDATE = function()
|
Nenue@28
|
322 return OBJECTIVE_TRACKER_UPDATE_SCENARIO
|
Nenue@28
|
323 end
|
Nenue@28
|
324 Event.SCENARIO_UPDATE = function(newStage)
|
Nenue@28
|
325 if ( newStage ) then
|
Nenue@28
|
326 return OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE
|
Nenue@28
|
327 else
|
Nenue@28
|
328 return OBJECTIVE_TRACKER_UPDATE_SCENARIO
|
Nenue@28
|
329 end
|
Nenue@28
|
330 end
|
Nenue@28
|
331 Event.TRACKED_ACHIEVEMENT_UPDATE = function()
|
Nenue@28
|
332 return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT
|
Nenue@28
|
333 end
|
Nenue@28
|
334 Event.TRACKED_ACHIEVEMENT_LIST_CHANGED = function(achievementID, added)
|
Nenue@37
|
335 return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED, achievementID, added
|
Nenue@28
|
336 end
|
Nenue@28
|
337 Event.ZONE_CHANGED_NEW_AREA = function ()
|
Nenue@28
|
338 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
|
Nenue@28
|
339 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker
|
Nenue@28
|
340 end
|
Nenue@28
|
341 SortQuestWatches();
|
Nenue@28
|
342 T.currentZoneArea = GetCurrentMapAreaID()
|
Nenue@28
|
343 print('Updating zone ID to', T.currentZoneArea, '=', GetZoneText(), GetMinimapZoneText())
|
Nenue@28
|
344
|
Nenue@28
|
345
|
Nenue@28
|
346 return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED
|
Nenue@28
|
347 end
|
Nenue@28
|
348
|
Nenue@28
|
349
|
Nenue@28
|
350 Event.PLAYER_MONEY = function()
|
Nenue@28
|
351 if T.watchMoneyReasons > 0 then
|
Nenue@28
|
352 return T.watchMoneyReasons
|
Nenue@28
|
353 end
|
Nenue@28
|
354 end
|
Nenue@28
|
355 Event.CRITERIA_COMPLETE = function()
|
Nenue@28
|
356 return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE
|
Nenue@28
|
357 end
|
Nenue@28
|
358 Event.QUEST_TURN_IN = function(questID, xp, money)
|
Nenue@28
|
359 if ( IsQuestTask(questID) ) then
|
Nenue@28
|
360 T.Bonus:OnTurnIn(questID, xp, money)
|
Nenue@28
|
361 print('updating bonus modules (code', OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, ',', questID, xp, money)
|
Nenue@28
|
362 return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, questID, xp, money
|
Nenue@28
|
363 else
|
Nenue@28
|
364 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST, questID, xp, money
|
Nenue@28
|
365 end
|
Nenue@28
|
366 end
|
Nenue@28
|
367 T.Event = Event
|
Nenue@28
|
368
|
Nenue@28
|
369 local VeneerData
|
Nenue@28
|
370
|
Nenue@28
|
371 T.SetWatchMoney = function(watchMoney, reason)
|
Nenue@28
|
372 if watchMoney then
|
Nenue@28
|
373 if band(T.watchMoneyReasons, reason) == 0 then
|
Nenue@28
|
374 T.watchMoneyReasons = T.watchMoneyReasons + reason;
|
Nenue@28
|
375 end
|
Nenue@28
|
376 else
|
Nenue@28
|
377 if band(T.watchMoneyReasons, reason) > 0 then
|
Nenue@28
|
378 T.watchMoneyReasons = T.watchMoneyReasons - reason;
|
Nenue@28
|
379 end
|
Nenue@28
|
380 end
|
Nenue@28
|
381 end
|
Nenue@28
|
382
|
Nenue@32
|
383 local iprint = B.print('Info')
|
Nenue@32
|
384 T.SetRewards = function(t, questID)
|
Nenue@34
|
385 local previousSelection = GetQuestLogSelection()
|
Nenue@32
|
386
|
Nenue@32
|
387 SelectQuestLogEntry(GetQuestLogIndexByID(questID))
|
Nenue@32
|
388 local numQuestChoices = GetNumQuestLogChoices();
|
Nenue@32
|
389 local skillName, skillIcon, skillPoints = GetQuestLogRewardSkillPoints();
|
Nenue@32
|
390 local xp = GetQuestLogRewardXP();
|
Nenue@32
|
391 local playerTitle = GetQuestLogRewardTitle();
|
Nenue@32
|
392 ProcessQuestLogRewardFactions();
|
Nenue@34
|
393
|
Nenue@32
|
394 local rewards = {}
|
Nenue@32
|
395 local texture, name, isTradeskillSpell, isSpellLearned, hideSpellLearnText, isBoostSpell, garrFollowerID = GetQuestLogRewardSpell(questID)
|
Nenue@32
|
396 if name then
|
Nenue@32
|
397 tinsert(rewards,{
|
Nenue@32
|
398 type = 'spell',
|
Nenue@32
|
399 name = name,
|
Nenue@32
|
400 texture = texture,
|
Nenue@32
|
401 })
|
Nenue@32
|
402 end
|
Nenue@39
|
403 if previousSelection then
|
Nenue@39
|
404 SelectQuestLogEntry(previousSelection)
|
Nenue@39
|
405 end
|
Nenue@32
|
406
|
Nenue@32
|
407 t.numCurrencies = GetNumQuestLogRewardCurrencies(questID)
|
Nenue@32
|
408 for i = 1, t.numCurrencies do
|
Nenue@32
|
409 local name, texture, count = GetQuestLogRewardCurrencyInfo(i, questID)
|
Nenue@32
|
410 tinsert(rewards,{
|
Nenue@32
|
411 type = 'currency',
|
Nenue@32
|
412 index = i,
|
Nenue@32
|
413 name = name,
|
Nenue@32
|
414 texture = texture,
|
Nenue@32
|
415 count = count
|
Nenue@32
|
416 });
|
Nenue@32
|
417 end
|
Nenue@32
|
418 -- items
|
Nenue@32
|
419 t.numItems = GetNumQuestLogRewards(questID)
|
Nenue@32
|
420 for i = 1, t.numItems do
|
Nenue@32
|
421 local name, texture, count, quality, isUsable = GetQuestLogRewardInfo(i, questID)
|
Nenue@32
|
422 tinsert(rewards, {
|
Nenue@32
|
423 type = 'item',
|
Nenue@32
|
424 index = i ,
|
Nenue@32
|
425 name = name,
|
Nenue@32
|
426 texture = texture,
|
Nenue@32
|
427 count = count,
|
Nenue@32
|
428 quality = quality,
|
Nenue@32
|
429 isUsable = isUsable
|
Nenue@32
|
430 });
|
Nenue@32
|
431 end
|
Nenue@32
|
432 -- money
|
Nenue@32
|
433
|
Nenue@32
|
434 local money = GetQuestLogRewardMoney(questID)
|
Nenue@32
|
435 if ( money > 0 ) then
|
Nenue@32
|
436 tinsert(rewards, {
|
Nenue@32
|
437 type = 'money',
|
Nenue@32
|
438 name = GetMoneyString(money),
|
Nenue@32
|
439 texture = "Interface\\Icons\\inv_misc_coin_01",
|
Nenue@32
|
440 count = 0,
|
Nenue@32
|
441 });
|
Nenue@32
|
442 end
|
Nenue@32
|
443
|
Nenue@32
|
444 if #rewards >= 1 then
|
Nenue@32
|
445 t.rewardInfo = rewards
|
Nenue@32
|
446 end
|
Nenue@32
|
447 end
|
Nenue@32
|
448
|
Nenue@28
|
449 local Play = function(file) if Devian and Devian.InWorkspace() then PlaySoundFile(file) end end
|
Nenue@28
|
450
|
Nenue@37
|
451 local tprint = B.print('Tracker')
|
Nenue@45
|
452 local ignoredNames = {
|
Nenue@45
|
453 ['SelectQuestLogEntry'] = true
|
Nenue@45
|
454 }
|
Nenue@34
|
455 T.OnHookedFunc = function(name, ...)
|
Nenue@45
|
456 --tprint('|cFFFF8800securehook:|r', name, '|cFF00FFFFargs:|r', ...)
|
Nenue@37
|
457 local updateReason, arg1, arg2, arg3 = T[name](...)
|
Nenue@34
|
458 if updateReason then
|
Nenue@45
|
459 tprint('OnHookedFunc(|cFF00FFFF'..name..'|r):', ...)
|
Nenue@37
|
460 T:Update(updateReason, arg1, arg2, arg3)
|
Nenue@45
|
461 elseif not ignoredNames[name] then
|
Nenue@45
|
462 tprint('OnHookedFunc(|cFFFF4400'..name..'|r):', ...)
|
Nenue@34
|
463 end
|
Nenue@34
|
464 end
|
Nenue@34
|
465
|
Nenue@28
|
466 function T:OnEvent (event, ...)
|
Nenue@28
|
467 local isHandled
|
Nenue@28
|
468 local reason, arg1, arg2, arg3
|
Nenue@28
|
469 if Event[event] then
|
Nenue@28
|
470 if type(Event[event]) == 'function' then
|
Nenue@28
|
471 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Info.ogg]])
|
Nenue@28
|
472 reason, arg1, arg2, arg3 = Event[event](...)
|
Nenue@28
|
473 else
|
Nenue@37
|
474 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Heart.ogg]])
|
Nenue@28
|
475 reason = Event[event]
|
Nenue@28
|
476 end
|
Nenue@28
|
477 else
|
Nenue@30
|
478 print('no event handler set for', event)
|
Nenue@45
|
479 tprint('no event handler set for', event)
|
Nenue@30
|
480 Play([[Interface\Addons\SharedMedia_MyMedia\sound\IM.ogg]])
|
Nenue@28
|
481 end
|
Nenue@28
|
482 if reason then
|
Nenue@45
|
483 local args = (reason or '0')
|
Nenue@45
|
484 if arg1 then args = args .. ', ' .. tostring(arg1) end
|
Nenue@45
|
485 if arg2 then args = args .. ', ' .. tostring(arg2) end
|
Nenue@45
|
486 if arg3 then args = args .. ', ' .. tostring(arg3) end
|
Nenue@45
|
487 print('OnEvent(|cFF00FF00'.. event ..'|r):', ..., '|cFFFFFF00=> Update (|r', args,'|cFFFFFF00)|r')
|
Nenue@45
|
488 tprint('OnEvent(|cFF00FF00'.. event ..'|r):', ..., '|cFFFFFF00=> Update (|r', args,'|cFFFFFF00)|r')
|
Nenue@28
|
489 T:Update(reason, arg1, arg2, arg3)
|
Nenue@28
|
490 else
|
Nenue@45
|
491 tprint('OnEvent(|cFFFF4400'.. event ..'|r):', ...)
|
Nenue@40
|
492 print('no detected reason')
|
Nenue@40
|
493 --Play([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]])
|
Nenue@28
|
494 end
|
Nenue@28
|
495
|
Nenue@28
|
496 end
|
Nenue@28
|
497
|
Nenue@28
|
498
|
Nenue@28
|
499 function T:OnInitialize()
|
Nenue@28
|
500 local c = T.Conf.Wrapper
|
Nenue@28
|
501 VeneerData = _G.VeneerData
|
Nenue@28
|
502 VeneerData.CallLog = VeneerData.CallLog or {}
|
Nenue@28
|
503 if not T.isHooked then
|
Nenue@28
|
504 T.isHooked = true
|
Nenue@44
|
505 for _, func in ipairs(BlizzHooks) do
|
Nenue@44
|
506 if T[func] then
|
Nenue@44
|
507 hooksecurefunc(func, function(...) return T.OnHookedFunc(func, ...) end)
|
Nenue@28
|
508 else
|
Nenue@44
|
509 hooksecurefunc(func, function(...)
|
Nenue@44
|
510 print('|cFFFF0088securehook('..tostring(func)..')|r args:', ...)
|
Nenue@44
|
511 tinsert(VeneerData.CallLog, {func, ...})
|
Nenue@28
|
512 end)
|
Nenue@28
|
513 end
|
Nenue@28
|
514 end
|
Nenue@28
|
515 end
|
Nenue@28
|
516
|
Nenue@40
|
517
|
Nenue@28
|
518
|
Nenue@28
|
519 ObjectiveTrackerFrame:UnregisterAllEvents()
|
Nenue@28
|
520 ObjectiveTrackerFrame:Hide()
|
Nenue@33
|
521 _G.MinimapCluster:Hide()
|
Nenue@28
|
522
|
Nenue@28
|
523 for id, name in ipairs(T.orderedNames) do
|
Nenue@28
|
524 if not T.orderedHandlers[id] then
|
Nenue@28
|
525 Handler_Initialize(T.DefaultHandler, name, id)
|
Nenue@28
|
526 end
|
Nenue@28
|
527 end
|
Nenue@28
|
528 self:SetSize(c.Width, 40)
|
Nenue@28
|
529 T.InitializeWidgets()
|
Nenue@28
|
530 end
|
Nenue@28
|
531
|
Nenue@28
|
532 --- Done any time the the minimize button is toggled up
|
Nenue@28
|
533 function T:OnEnable()
|
Nenue@28
|
534
|
Nenue@28
|
535 print(B.Conf.VeneerObjectiveWrapper.enabled)
|
Nenue@34
|
536
|
Nenue@28
|
537
|
Nenue@28
|
538 for event, action in pairs(Event) do
|
Nenue@28
|
539 print('|cFFFF0088listen to', event, 'for action|r', tostring(action))
|
Nenue@28
|
540 Wrapper:RegisterEvent(event)
|
Nenue@28
|
541 end
|
Nenue@28
|
542
|
Nenue@28
|
543 local c = T.Conf.Wrapper
|
Nenue@30
|
544 Wrapper.previousHeight = 0
|
Nenue@28
|
545 Scroller:SetScrollChild(Scroll)
|
Nenue@28
|
546 Scroller:SetWidth(c.Width)
|
Nenue@28
|
547 Scroll:SetWidth(c.Width)
|
Nenue@28
|
548 Scroll:ClearAllPoints()
|
Nenue@28
|
549 Scroll:SetPoint('TOP', Scroller, 'TOP')
|
Nenue@28
|
550 self:SetScript('OnEvent', T.OnEvent)
|
Nenue@28
|
551
|
Nenue@28
|
552 Scroller:Show()
|
Nenue@28
|
553
|
Nenue@28
|
554 local from, target, to, x, y = Wrapper:GetPoint(1)
|
Nenue@38
|
555 print(from, target, to, x,y)
|
Nenue@28
|
556
|
Nenue@28
|
557
|
Nenue@38
|
558 T.UpdateSchema('tracker', 'default')
|
Nenue@28
|
559 -- run once to prime the data structure
|
Nenue@28
|
560 T.UpdateActionButtons()
|
Nenue@28
|
561 end
|
Nenue@28
|
562
|
Nenue@28
|
563 function T:OnDisable()
|
Nenue@28
|
564 self:UnregisterAllEvents()
|
Nenue@28
|
565 Scroller:Hide()
|
Nenue@28
|
566 end
|
Nenue@28
|
567
|