Mercurial > wow > buffalo2
comparison ObjectiveCore.lua @ 22:9b3fa734abff
ObjectiveFrame
- polish quest rewards display
- implement money objectives
- set line metrics in UpdateLine
- set block metrics in UpdateBlock (sum of line metrics)
author | Nenue |
---|---|
date | Sat, 09 Apr 2016 07:32:45 -0400 |
parents | d5ee940de273 |
children |
comparison
equal
deleted
inserted
replaced
21:d5ee940de273 | 22:9b3fa734abff |
---|---|
2 -- @file-author@ | 2 -- @file-author@ |
3 -- @project-revision@ @project-hash@ | 3 -- @project-revision@ @project-hash@ |
4 -- @file-revision@ @file-hash@ | 4 -- @file-revision@ @file-hash@ |
5 -- Created: 3/26/2016 1:51 AM | 5 -- Created: 3/26/2016 1:51 AM |
6 local B, _G = select(2,...).frame, _G | 6 local B, _G = select(2,...).frame, _G |
7 local pairs, setmetatable, type, tostring = _G.pairs, _G.setmetatable, _G.type, _G.tostring | 7 local pairs, setmetatable, type, tostring, band, format = _G.pairs, _G.setmetatable, _G.type, _G.tostring, bit.band, string.format |
8 local format = _G.format | 8 local ipairs, tinsert, hooksecurefunc = _G.ipairs, _G.tinsert, _G.hooksecurefunc |
9 local PlaySoundFile, IsQuestTask, SortQuestWatches, GetCurrentMapAreaID, GetZoneText, GetMinimapZoneText = PlaySoundFile, IsQuestTask, SortQuestWatches, GetCurrentMapAreaID, GetZoneText, GetMinimapZoneText | |
10 local AddQuestWatch, SetSuperTrackedQuestID, GetNumQuestWatches, AUTO_QUEST_WATCH, MAX_WATCHABLE_QUESTS = AddQuestWatch, SetSuperTrackedQuestID, GetNumQuestWatches, AUTO_QUEST_WATCH, MAX_WATCHABLE_QUESTS | |
11 local QuestPOIUpdateIcons, GetCVar, IsPlayerInMicroDungeon, WorldMapFrame, GetCVarBool, SetMapToCurrentZone = QuestPOIUpdateIcons, GetCVar, IsPlayerInMicroDungeon, WorldMapFrame, GetCVarBool, SetMapToCurrentZone | |
12 local AddAutoQuestPopUp = AddAutoQuestPopUp | |
9 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') | 13 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') |
10 local print = B.print('Objectives') | 14 local print = B.print('Objectives') |
11 local ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame = _G.ObjectiveTrackerFrame, _G.VeneerObjectiveScroll, _G.CreateFrame | 15 local ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame = _G.ObjectiveTrackerFrame, _G.VeneerObjectiveScroll, _G.CreateFrame |
12 local Wrapper = _G.VeneerObjectiveWrapper | 16 local Wrapper = _G.VeneerObjectiveWrapper |
13 local ipairs, tinsert, hooksecurefunc = _G.ipairs, _G.tinsert, _G.hooksecurefunc | |
14 local Scroller = VeneerObjectiveWrapper.scrollArea | 17 local Scroller = VeneerObjectiveWrapper.scrollArea |
15 local Scroll = _G.VeneerObjectiveScroll | 18 local Scroll = _G.VeneerObjectiveScroll |
16 | 19 |
17 --- Performance values | 20 --- Performance values |
18 --[[ | 21 --[[ |
140 } | 143 } |
141 mod.Bonus = { | 144 mod.Bonus = { |
142 name = "Bonus", | 145 name = "Bonus", |
143 displayName = "Bonus Objectives", | 146 displayName = "Bonus Objectives", |
144 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, | 147 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, |
145 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST + | 148 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST + OBJECTIVE_TRACKER_UPDATE_TASK_ADDED |
146 OBJECTIVE_TRACKER_UPDATE_TASK_ADDED + | |
147 OBJECTIVE_TRACKER_UPDATE_SCENARIO + | |
148 OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE + | |
149 OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED | |
150 } | 149 } |
151 | 150 |
152 local Tracker_string = function (self) | 151 local Tracker_string = function (self) |
153 return self.name | 152 return self.name |
154 end | 153 end |
207 | 206 |
208 mod.orderedHandlers[index] = handler | 207 mod.orderedHandlers[index] = handler |
209 return true | 208 return true |
210 end | 209 end |
211 | 210 |
212 | 211 local Event = {} |
213 function mod:OnEvent (event, ...) | 212 Event.QUEST_LOG_UPDATE = function() |
214 local isHandled | 213 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE |
215 print('OnEvent(|cFF00FF00'.. event ..'|r):', ...) | 214 end |
216 if ( event == "QUEST_LOG_UPDATE" ) then | 215 Event.QUEST_ACCEPTED = function(questLogIndex, questID) |
217 mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST); | 216 if ( IsQuestTask(questID) ) then |
218 | 217 return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED, questID |
219 elseif ( event == "TRACKED_ACHIEVEMENT_UPDATE" ) then | 218 else |
220 --AchievementObjectiveTracker_OnAchievementUpdate(...); | 219 if ( AUTO_QUEST_WATCH == "1" and GetNumQuestWatches() < MAX_WATCHABLE_QUESTS ) then |
221 mod.Cheevs:Update(OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT) | 220 AddQuestWatch(questLogIndex); |
222 | 221 SetSuperTrackedQuestID(questID); |
223 elseif ( event == "QUEST_ACCEPTED" ) then | 222 end |
224 local questLogIndex, questID = ...; | 223 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST |
225 if ( IsQuestTask(questID) ) then | 224 end |
226 mod:Update(OBJECTIVE_TRACKER_UPDATE_TASK_ADDED, questID); | 225 end |
227 else | 226 Event.QUEST_WATCH_LIST_CHANGED = function(questID, added) |
228 if ( AUTO_QUEST_WATCH == "1" and GetNumQuestWatches() < MAX_WATCHABLE_QUESTS ) then | 227 if ( added ) then |
229 AddQuestWatch(questLogIndex); | 228 if ( not IsQuestTask(questID) ) then |
230 SetSuperTrackedQuestID(questID); | 229 return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added |
231 end | 230 end |
232 mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST) | 231 else |
233 end | 232 return OBJECTIVE_TRACKER_UPDATE_QUEST, questID, added |
234 | 233 end |
235 elseif ( event == "TRACKED_ACHIEVEMENT_LIST_CHANGED" ) then | 234 end |
236 local achievementID, added = ...; | 235 Event.QUEST_POI_UPDATE = function() |
237 if ( added ) then | 236 |
238 mod:Update(OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED, achievementID); | 237 QuestPOIUpdateIcons(); |
239 else | 238 if ( GetCVar("trackQuestSorting") == "proximity" ) then |
240 mod:Update(OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT); | 239 SortQuestWatches(); |
241 end | 240 end |
242 | 241 |
243 elseif ( event == "QUEST_WATCH_LIST_CHANGED" ) then | 242 return OBJECTIVE_TRACKER_UPDATE_ALL |
244 local questID, added = ...; | 243 |
245 if ( added ) then | 244 end |
246 if ( not IsQuestTask(questID) ) then | 245 Event.SUPER_TRACKED_QUEST_CHANGED = function() |
247 mod:Update(OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added); | 246 return OBJECTIVE_TRACKER_UPDATE_QUEST |
248 end | 247 end |
249 else | 248 Event.ZONE_CHANGED = function() |
250 mod:Update(OBJECTIVE_TRACKER_UPDATE_QUEST, questID, added); | 249 |
251 end | 250 local inMicroDungeon = IsPlayerInMicroDungeon(); |
252 | 251 if ( inMicroDungeon ~= mod.inMicroDungeon ) then |
253 elseif ( event == "QUEST_POI_UPDATE" ) then | |
254 QuestPOIUpdateIcons(); | |
255 if ( GetCVar("trackQuestSorting") == "proximity" ) then | |
256 SortQuestWatches(); | |
257 end | |
258 | |
259 mod:Update(OBJECTIVE_TRACKER_UPDATE_ALL); | |
260 | |
261 elseif ( event == "SCENARIO_CRITERIA_UPDATE" ) then | |
262 mod:Update(OBJECTIVE_TRACKER_UPDATE_SCENARIO); | |
263 elseif ( event == "SUPER_TRACKED_QUEST_CHANGED" ) then | |
264 --mod:Update(OBJECTIVE_TRACKER_UPDATE_QUEST) | |
265 elseif ( event == "ZONE_CHANGED" ) then | |
266 local inMicroDungeon = IsPlayerInMicroDungeon(); | |
267 if ( inMicroDungeon ~= self.inMicroDungeon ) then | |
268 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then | |
269 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker | |
270 end | |
271 --SortQuestWatches(); | |
272 self.inMicroDungeon = inMicroDungeon; | |
273 end | |
274 elseif ( event == "QUEST_AUTOCOMPLETE" ) then | |
275 local questId = ...; | |
276 AddAutoQuestPopUp(questId, "COMPLETE"); | |
277 mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST) | |
278 elseif ( event == "SCENARIO_UPDATE" ) then | |
279 local newStage = ...; | |
280 if ( newStage ) then | |
281 mod:Update(OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE); | |
282 else | |
283 mod:Update(OBJECTIVE_TRACKER_UPDATE_SCENARIO); | |
284 end | |
285 elseif ( event == "ZONE_CHANGED_NEW_AREA" ) then | |
286 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then | 252 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then |
287 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker | 253 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker |
288 end | 254 end |
289 SortQuestWatches(); | 255 --SortQuestWatches(); |
290 mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE) | 256 mod.inMicroDungeon = inMicroDungeon; |
291 elseif (event == 'CRITERIA_COMPLETE') then | 257 end |
292 mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE) | 258 end |
293 | 259 Event.QUEST_AUTOCOMPLETE = function(questId) |
294 elseif ( event == "QUEST_TURNED_IN" ) then | 260 AddAutoQuestPopUp(questId, "COMPLETE"); |
295 local questID, xp, money = ...; | 261 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP |
296 if ( IsQuestTask(questID) ) then | 262 end |
297 mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE) | 263 Event.SCENARIO_CRITERIA_UPDATE = function() |
298 else | 264 return OBJECTIVE_TRACKER_UPDATE_SCENARIO |
299 | 265 end |
300 mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST) | 266 Event.SCENARIO_UPDATE = function(newStage) |
301 end | 267 if ( newStage ) then |
302 elseif ( event == "PLAYER_MONEY" and self.watchMoneyReasons > 0 ) then | 268 return OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE |
303 -- only update trackers that have money counters | 269 else |
304 mod:Update(self.watchMoneyReasons); | 270 return OBJECTIVE_TRACKER_UPDATE_SCENARIO |
305 end | 271 end |
306 end | 272 end |
273 Event.TRACKED_ACHIEVEMENT_UPDATE = function() | |
274 return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT | |
275 end | |
276 Event.TRACKED_ACHIEVEMENT_LIST_CHANGED = function(achievementID, added) | |
277 if ( added ) then | |
278 return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED, achievementID | |
279 else | |
280 return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT | |
281 end | |
282 end | |
283 Event.ZONE_CHANGED_NEW_AREA = function () | |
284 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then | |
285 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker | |
286 end | |
287 SortQuestWatches(); | |
288 mod.currentZoneArea = GetCurrentMapAreaID() | |
289 print('Updating zone ID to', mod.currentZoneArea, '=', GetZoneText(), GetMinimapZoneText()) | |
290 | |
291 | |
292 return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED | |
293 end | |
294 | |
295 | |
296 Event.PLAYER_MONEY = function() | |
297 if mod.watchMoneyReasons > 0 then | |
298 return mod.watchMoneyReasons | |
299 end | |
300 end | |
301 Event.CRITERIA_COMPLETE = function() | |
302 return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE | |
303 end | |
304 Event.QUEST_TURN_IN = function(questID, xp, money) | |
305 if ( IsQuestTask(questID) ) then | |
306 mod.Bonus:OnTurnIn(questID, xp, money) | |
307 print('updating bonus modules (code', OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, ',', questID, xp, money) | |
308 return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, questID, xp, money | |
309 else | |
310 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST, questID, xp, money | |
311 end | |
312 end | |
313 mod.Event = Event | |
307 | 314 |
308 --- Done once per ui load | 315 --- Done once per ui load |
309 local BlizzHooks = { | 316 local BlizzHooks = { |
310 ['AddQuestWatch'] = 'AddQuestWatch', | 317 ['AddQuestWatch'] = 'AddQuestWatch', |
311 ['RemoveQuestWatch'] = 'RemoveQuestWatch', | 318 ['RemoveQuestWatch'] = 'RemoveQuestWatch', |
316 ['AddTrackedAchievement'] = 'AddTrackedAchievement', | 323 ['AddTrackedAchievement'] = 'AddTrackedAchievement', |
317 ['RemoveTrackedAchievement'] = 'RemoveTrackedAchievement', | 324 ['RemoveTrackedAchievement'] = 'RemoveTrackedAchievement', |
318 ['SetSuperTrackedQuestID'] = 'SetSuperTrackedQuestID' | 325 ['SetSuperTrackedQuestID'] = 'SetSuperTrackedQuestID' |
319 } | 326 } |
320 local VeneerData | 327 local VeneerData |
328 | |
329 mod.SetWatchMoney = function(watchMoney, reason) | |
330 if watchMoney then | |
331 if band(mod.watchMoneyReasons, reason) == 0 then | |
332 mod.watchMoneyReasons = mod.watchMoneyReasons + reason; | |
333 end | |
334 else | |
335 if band(mod.watchMoneyReasons, reason) > 0 then | |
336 mod.watchMoneyReasons = mod.watchMoneyReasons - reason; | |
337 end | |
338 end | |
339 end | |
340 | |
341 | |
321 function mod:OnInitialize() | 342 function mod:OnInitialize() |
322 local c = mod.Conf.Wrapper | 343 local c = mod.Conf.Wrapper |
323 VeneerData = _G.VeneerData | 344 VeneerData = _G.VeneerData |
324 VeneerData.CallLog = VeneerData.CallLog or {} | 345 VeneerData.CallLog = VeneerData.CallLog or {} |
325 if not mod.isHooked then | 346 if not mod.isHooked then |
333 tinsert(VeneerData.CallLog, {blizzFunc, ...}) | 354 tinsert(VeneerData.CallLog, {blizzFunc, ...}) |
334 end) | 355 end) |
335 end | 356 end |
336 end | 357 end |
337 end | 358 end |
359 | |
360 mod.Conf.TasksLog = mod.Conf.TasksLog or {} | |
361 | |
338 Scroller:SetScrollChild(Scroll) | 362 Scroller:SetScrollChild(Scroll) |
339 Scroller:SetWidth(c.Width) | 363 Scroller:SetWidth(c.Width) |
340 Scroll:SetWidth(c.Width) | 364 Scroll:SetWidth(c.Width) |
341 Scroll:ClearAllPoints() | 365 Scroll:ClearAllPoints() |
342 Scroll:SetPoint('TOP', Scroller, 'TOP') | 366 Scroll:SetPoint('TOP', Scroller, 'TOP') |
343 ObjectiveTrackerFrame:UnregisterAllEvents() | 367 ObjectiveTrackerFrame:UnregisterAllEvents() |
344 ObjectiveTrackerFrame:Hide() | 368 ObjectiveTrackerFrame:Hide() |
345 end | 369 end |
346 | 370 |
371 function mod:OnEvent (event, ...) | |
372 local isHandled | |
373 print('OnEvent(|cFF00FF00'.. event ..'|r):', ...) | |
374 local reason, arg1, arg2, arg3 | |
375 if Event[event] then | |
376 if type(Event[event]) == 'function' then | |
377 PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Info.ogg]]) | |
378 reason, arg1, arg2, arg3 = Event[event](...) | |
379 elseif type(Event[event]) == 'table' then | |
380 PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Link.ogg]]) | |
381 for i, action in ipairs(Event[event]) do | |
382 if type(action) == 'function' then | |
383 reason, arg1, arg2, arg3 = action(event, ...) | |
384 else | |
385 reason = action | |
386 end | |
387 | |
388 if reason then | |
389 mod:Update(reason, arg1, arg2, arg3) | |
390 end | |
391 end | |
392 else | |
393 PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Heart.ogg]]) | |
394 reason = Event[event] | |
395 end | |
396 else | |
397 PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]]) | |
398 end | |
399 if reason then | |
400 mod:Update(reason, arg1, arg2, arg3) | |
401 else | |
402 print('no reason value returned') | |
403 PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]]) | |
404 end | |
405 end | |
406 | |
347 --- Done any time the the minimize button is toggled up | 407 --- Done any time the the minimize button is toggled up |
348 | |
349 | |
350 function mod:OnEnable() | 408 function mod:OnEnable() |
351 for id, name in ipairs(mod.orderedNames) do | 409 for id, name in ipairs(mod.orderedNames) do |
352 if not mod.orderedHandlers[id] then | 410 if not mod.orderedHandlers[id] then |
353 Handler_Initialize(mod.DefaultHandler, name, id) | 411 Handler_Initialize(mod.DefaultHandler, name, id) |
354 end | 412 end |
355 end | 413 end |
356 | 414 |
357 Wrapper:RegisterEvent("CRITERIA_COMPLETE"); | 415 for event, action in pairs(Event) do |
358 Wrapper:RegisterEvent("SCENARIO_UPDATE"); | 416 print('|cFFFF0088listen to', event, 'for action|r', tostring(action)) |
359 Wrapper:RegisterEvent("SCENARIO_CRITERIA_UPDATE"); | 417 Wrapper:RegisterEvent(event) |
360 Wrapper:RegisterEvent("PLAYER_MONEY"); | 418 end |
361 Wrapper:RegisterEvent("QUEST_ACCEPTED"); | 419 |
362 Wrapper:RegisterEvent("QUEST_AUTOCOMPLETE"); | |
363 Wrapper:RegisterEvent("QUEST_LOG_UPDATE"); | |
364 Wrapper:RegisterEvent("QUEST_POI_UPDATE"); | |
365 Wrapper:RegisterEvent("QUEST_TURNED_IN"); | |
366 Wrapper:RegisterEvent("QUEST_WATCH_LIST_CHANGED"); | |
367 Wrapper:RegisterEvent("SUPER_TRACKED_QUEST_CHANGED"); | |
368 Wrapper:RegisterEvent("TRACKED_ACHIEVEMENT_LIST_CHANGED"); | |
369 Wrapper:RegisterEvent("TRACKED_ACHIEVEMENT_UPDATE"); | |
370 Wrapper:RegisterEvent("VARIABLES_LOADED"); | |
371 Wrapper:RegisterEvent("ZONE_CHANGED_NEW_AREA"); | |
372 Wrapper:RegisterEvent("ZONE_CHANGED"); | |
373 Wrapper:SetScript('OnEvent', mod.OnEvent) | 420 Wrapper:SetScript('OnEvent', mod.OnEvent) |
374 | 421 |
375 local c = mod.Conf.Wrapper | 422 local c = mod.Conf.Wrapper |
376 --Wrapper:SetPoint(c.AnchorPoint, UIParent, c.AnchorPoint, c.OffsetX, c.OffsetY) | 423 --Wrapper:SetPoint(c.AnchorPoint, UIParent, c.AnchorPoint, c.OffsetX, c.OffsetY) |
377 --B.Conf.FramePosition[Wrapper:GetName()] = {c.AnchorPoint, c.AnchorPoint, c.OffsetX, c.OffsetY} | 424 --B.Conf.FramePosition[Wrapper:GetName()] = {c.AnchorPoint, c.AnchorPoint, c.OffsetX, c.OffsetY} |
381 mod.InitializeWidgets() | 428 mod.InitializeWidgets() |
382 mod:Update() | 429 mod:Update() |
383 end | 430 end |
384 | 431 |
385 function mod:OnDisable() | 432 function mod:OnDisable() |
386 | 433 Wrapper:UnregisterAllEvents() |
387 end | 434 end |
388 | 435 |
389 | 436 |