annotate ObjectiveTracker/ObjectiveTracker.lua @ 37:e84d645c8ab8

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