annotate ObjectiveTracker/ObjectiveTracker.lua @ 54:ed74c5cabe98

Core - updated comment notes Objectives - force hide blocks when their tracker is hidden Clock - convert clock into its own module - display zone coordinates alongside time
author Nenue
date Wed, 01 Jun 2016 20:48:14 -0400
parents 1a322b92dbfa
children
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@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@54 248 frame:SetScript('OnHide', T.DefaultHandler.OnHide)
Nenue@54 249 frame.handler = handler
Nenue@29 250
Nenue@28 251 handler.frame = frame
Nenue@29 252 handler.numBlocks = 0
Nenue@29 253 handler.actualBlocks = 0
Nenue@28 254 handler.trackerName = trackerName
Nenue@28 255 handler.lines = {}
Nenue@28 256 T.orderedTrackers[index] = frame
Nenue@28 257 T.namedTrackers[name] = frame
Nenue@28 258 T.indexedTrackers[handler] = frame
Nenue@28 259 print('|cFFFF0088' .. trackerName .. '|r created for |cFF00FFFF' .. handler.displayName .. '|r module')
Nenue@28 260
Nenue@38 261 handler.print = Tracker_debug(handler, 'Tracker')
Nenue@38 262 handler.lprint = Tracker_debug(handler, 'Line')
Nenue@38 263 handler.bprint = Tracker_debug(handler, 'Block')
Nenue@38 264
Nenue@28 265 T.orderedHandlers[index] = handler
Nenue@28 266 return true
Nenue@28 267 end
Nenue@28 268
Nenue@28 269 local Event = {}
Nenue@39 270
Nenue@28 271 Event.QUEST_LOG_UPDATE = function()
Nenue@39 272 return OBJECTIVE_TRACKER_UPDATE_QUEST
Nenue@28 273 end
Nenue@30 274 local GetNumQuestWatches, AddQuestWatch, SetSuperTrackedQuestID = GetNumQuestWatches, AddQuestWatch, SetSuperTrackedQuestID
Nenue@30 275 Event.QUEST_ACCEPTED = function(questLogIndex, questID, added)
Nenue@45 276
Nenue@45 277 --todo: stall non-confirmed autoquests
Nenue@45 278 AddQuestWatch(questLogIndex)
Nenue@28 279 if ( IsQuestTask(questID) ) then
Nenue@38 280 return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED + OBJECTIVE_TRACKER_UPDATE_TASK_ADDED, questID, added
Nenue@28 281 else
Nenue@38 282 return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added
Nenue@28 283 end
Nenue@28 284 end
Nenue@28 285
Nenue@28 286 Event.QUEST_WATCH_LIST_CHANGED = function(questID, added)
Nenue@37 287 if ( added == true ) then
Nenue@28 288 if ( not IsQuestTask(questID) ) then
Nenue@28 289 return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added
Nenue@28 290 end
Nenue@37 291 elseif questID then
Nenue@37 292 return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added
Nenue@38 293 else
Nenue@38 294 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST
Nenue@28 295 end
Nenue@28 296 end
Nenue@28 297
Nenue@28 298 Event.QUEST_POI_UPDATE = function()
Nenue@28 299 QuestPOIUpdateIcons();
Nenue@28 300 if ( GetCVar("trackQuestSorting") == "proximity" ) then
Nenue@28 301 SortQuestWatches();
Nenue@28 302 end
Nenue@28 303 return OBJECTIVE_TRACKER_UPDATE_ALL
Nenue@28 304 end
Nenue@37 305 Event.SUPER_TRACKED_QUEST_CHANGED = function(questID)
Nenue@44 306 --return OBJECTIVE_TRACKER_UPDATE_QUEST, questID
Nenue@28 307 end
Nenue@28 308 Event.ZONE_CHANGED = function()
Nenue@28 309 local inMicroDungeon = IsPlayerInMicroDungeon();
Nenue@28 310 if ( inMicroDungeon ~= T.inMicroDungeon ) then
Nenue@28 311 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
Nenue@28 312 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker
Nenue@28 313 end
Nenue@28 314 --SortQuestWatches();
Nenue@28 315 T.inMicroDungeon = inMicroDungeon;
Nenue@28 316 end
Nenue@33 317 return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE + OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO
Nenue@28 318 end
Nenue@28 319 Event.QUEST_AUTOCOMPLETE = function(questId)
Nenue@28 320 AddAutoQuestPopUp(questId, "COMPLETE");
Nenue@28 321 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP
Nenue@28 322 end
Nenue@28 323 Event.SCENARIO_CRITERIA_UPDATE = function()
Nenue@28 324 return OBJECTIVE_TRACKER_UPDATE_SCENARIO
Nenue@28 325 end
Nenue@28 326 Event.SCENARIO_UPDATE = function(newStage)
Nenue@28 327 if ( newStage ) then
Nenue@28 328 return OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE
Nenue@28 329 else
Nenue@28 330 return OBJECTIVE_TRACKER_UPDATE_SCENARIO
Nenue@28 331 end
Nenue@28 332 end
Nenue@28 333 Event.TRACKED_ACHIEVEMENT_UPDATE = function()
Nenue@28 334 return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT
Nenue@28 335 end
Nenue@28 336 Event.TRACKED_ACHIEVEMENT_LIST_CHANGED = function(achievementID, added)
Nenue@37 337 return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED, achievementID, added
Nenue@28 338 end
Nenue@28 339 Event.ZONE_CHANGED_NEW_AREA = function ()
Nenue@28 340 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
Nenue@28 341 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker
Nenue@28 342 end
Nenue@28 343 SortQuestWatches();
Nenue@28 344 T.currentZoneArea = GetCurrentMapAreaID()
Nenue@28 345 print('Updating zone ID to', T.currentZoneArea, '=', GetZoneText(), GetMinimapZoneText())
Nenue@28 346
Nenue@28 347
Nenue@28 348 return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED
Nenue@28 349 end
Nenue@28 350
Nenue@28 351
Nenue@28 352 Event.PLAYER_MONEY = function()
Nenue@28 353 if T.watchMoneyReasons > 0 then
Nenue@28 354 return T.watchMoneyReasons
Nenue@28 355 end
Nenue@28 356 end
Nenue@28 357 Event.CRITERIA_COMPLETE = function()
Nenue@28 358 return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE
Nenue@28 359 end
Nenue@28 360 Event.QUEST_TURN_IN = function(questID, xp, money)
Nenue@28 361 if ( IsQuestTask(questID) ) then
Nenue@28 362 T.Bonus:OnTurnIn(questID, xp, money)
Nenue@28 363 print('updating bonus modules (code', OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, ',', questID, xp, money)
Nenue@28 364 return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, questID, xp, money
Nenue@28 365 else
Nenue@28 366 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST, questID, xp, money
Nenue@28 367 end
Nenue@28 368 end
Nenue@28 369 T.Event = Event
Nenue@28 370
Nenue@28 371 local VeneerData
Nenue@28 372
Nenue@28 373 T.SetWatchMoney = function(watchMoney, reason)
Nenue@28 374 if watchMoney then
Nenue@28 375 if band(T.watchMoneyReasons, reason) == 0 then
Nenue@28 376 T.watchMoneyReasons = T.watchMoneyReasons + reason;
Nenue@28 377 end
Nenue@28 378 else
Nenue@28 379 if band(T.watchMoneyReasons, reason) > 0 then
Nenue@28 380 T.watchMoneyReasons = T.watchMoneyReasons - reason;
Nenue@28 381 end
Nenue@28 382 end
Nenue@28 383 end
Nenue@28 384
Nenue@32 385 local iprint = B.print('Info')
Nenue@32 386 T.SetRewards = function(t, questID)
Nenue@34 387 local previousSelection = GetQuestLogSelection()
Nenue@32 388
Nenue@32 389 SelectQuestLogEntry(GetQuestLogIndexByID(questID))
Nenue@32 390 local numQuestChoices = GetNumQuestLogChoices();
Nenue@32 391 local skillName, skillIcon, skillPoints = GetQuestLogRewardSkillPoints();
Nenue@32 392 local xp = GetQuestLogRewardXP();
Nenue@32 393 local playerTitle = GetQuestLogRewardTitle();
Nenue@32 394 ProcessQuestLogRewardFactions();
Nenue@34 395
Nenue@32 396 local rewards = {}
Nenue@32 397 local texture, name, isTradeskillSpell, isSpellLearned, hideSpellLearnText, isBoostSpell, garrFollowerID = GetQuestLogRewardSpell(questID)
Nenue@32 398 if name then
Nenue@32 399 tinsert(rewards,{
Nenue@32 400 type = 'spell',
Nenue@32 401 name = name,
Nenue@32 402 texture = texture,
Nenue@32 403 })
Nenue@32 404 end
Nenue@39 405 if previousSelection then
Nenue@39 406 SelectQuestLogEntry(previousSelection)
Nenue@39 407 end
Nenue@32 408
Nenue@32 409 t.numCurrencies = GetNumQuestLogRewardCurrencies(questID)
Nenue@32 410 for i = 1, t.numCurrencies do
Nenue@32 411 local name, texture, count = GetQuestLogRewardCurrencyInfo(i, questID)
Nenue@32 412 tinsert(rewards,{
Nenue@32 413 type = 'currency',
Nenue@32 414 index = i,
Nenue@32 415 name = name,
Nenue@32 416 texture = texture,
Nenue@32 417 count = count
Nenue@32 418 });
Nenue@32 419 end
Nenue@32 420 -- items
Nenue@32 421 t.numItems = GetNumQuestLogRewards(questID)
Nenue@32 422 for i = 1, t.numItems do
Nenue@32 423 local name, texture, count, quality, isUsable = GetQuestLogRewardInfo(i, questID)
Nenue@32 424 tinsert(rewards, {
Nenue@32 425 type = 'item',
Nenue@32 426 index = i ,
Nenue@32 427 name = name,
Nenue@32 428 texture = texture,
Nenue@32 429 count = count,
Nenue@32 430 quality = quality,
Nenue@32 431 isUsable = isUsable
Nenue@32 432 });
Nenue@32 433 end
Nenue@32 434 -- money
Nenue@32 435
Nenue@32 436 local money = GetQuestLogRewardMoney(questID)
Nenue@32 437 if ( money > 0 ) then
Nenue@32 438 tinsert(rewards, {
Nenue@32 439 type = 'money',
Nenue@32 440 name = GetMoneyString(money),
Nenue@32 441 texture = "Interface\\Icons\\inv_misc_coin_01",
Nenue@32 442 count = 0,
Nenue@32 443 });
Nenue@32 444 end
Nenue@32 445
Nenue@32 446 if #rewards >= 1 then
Nenue@32 447 t.rewardInfo = rewards
Nenue@32 448 end
Nenue@32 449 end
Nenue@32 450
Nenue@28 451 local Play = function(file) if Devian and Devian.InWorkspace() then PlaySoundFile(file) end end
Nenue@28 452
Nenue@37 453 local tprint = B.print('Tracker')
Nenue@45 454 local ignoredNames = {
Nenue@45 455 ['SelectQuestLogEntry'] = true
Nenue@45 456 }
Nenue@34 457 T.OnHookedFunc = function(name, ...)
Nenue@45 458 --tprint('|cFFFF8800securehook:|r', name, '|cFF00FFFFargs:|r', ...)
Nenue@37 459 local updateReason, arg1, arg2, arg3 = T[name](...)
Nenue@34 460 if updateReason then
Nenue@45 461 tprint('OnHookedFunc(|cFF00FFFF'..name..'|r):', ...)
Nenue@37 462 T:Update(updateReason, arg1, arg2, arg3)
Nenue@45 463 elseif not ignoredNames[name] then
Nenue@45 464 tprint('OnHookedFunc(|cFFFF4400'..name..'|r):', ...)
Nenue@34 465 end
Nenue@34 466 end
Nenue@34 467
Nenue@28 468 function T:OnEvent (event, ...)
Nenue@28 469 local isHandled
Nenue@28 470 local reason, arg1, arg2, arg3
Nenue@28 471 if Event[event] then
Nenue@28 472 if type(Event[event]) == 'function' then
Nenue@28 473 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Info.ogg]])
Nenue@28 474 reason, arg1, arg2, arg3 = Event[event](...)
Nenue@28 475 else
Nenue@37 476 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Heart.ogg]])
Nenue@28 477 reason = Event[event]
Nenue@28 478 end
Nenue@28 479 else
Nenue@30 480 print('no event handler set for', event)
Nenue@45 481 tprint('no event handler set for', event)
Nenue@30 482 Play([[Interface\Addons\SharedMedia_MyMedia\sound\IM.ogg]])
Nenue@28 483 end
Nenue@28 484 if reason then
Nenue@45 485 local args = (reason or '0')
Nenue@45 486 if arg1 then args = args .. ', ' .. tostring(arg1) end
Nenue@45 487 if arg2 then args = args .. ', ' .. tostring(arg2) end
Nenue@45 488 if arg3 then args = args .. ', ' .. tostring(arg3) end
Nenue@45 489 print('OnEvent(|cFF00FF00'.. event ..'|r):', ..., '|cFFFFFF00=> Update (|r', args,'|cFFFFFF00)|r')
Nenue@45 490 tprint('OnEvent(|cFF00FF00'.. event ..'|r):', ..., '|cFFFFFF00=> Update (|r', args,'|cFFFFFF00)|r')
Nenue@28 491 T:Update(reason, arg1, arg2, arg3)
Nenue@28 492 else
Nenue@45 493 tprint('OnEvent(|cFFFF4400'.. event ..'|r):', ...)
Nenue@40 494 print('no detected reason')
Nenue@40 495 --Play([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]])
Nenue@28 496 end
Nenue@28 497
Nenue@28 498 end
Nenue@28 499
Nenue@28 500
Nenue@28 501 function T:OnInitialize()
Nenue@28 502 local c = T.Conf.Wrapper
Nenue@28 503 VeneerData = _G.VeneerData
Nenue@54 504 --VeneerData.CallLog = VeneerData.CallLog or {}
Nenue@28 505 if not T.isHooked then
Nenue@28 506 T.isHooked = true
Nenue@44 507 for _, func in ipairs(BlizzHooks) do
Nenue@44 508 if T[func] then
Nenue@44 509 hooksecurefunc(func, function(...) return T.OnHookedFunc(func, ...) end)
Nenue@28 510 else
Nenue@44 511 hooksecurefunc(func, function(...)
Nenue@44 512 print('|cFFFF0088securehook('..tostring(func)..')|r args:', ...)
Nenue@44 513 tinsert(VeneerData.CallLog, {func, ...})
Nenue@28 514 end)
Nenue@28 515 end
Nenue@28 516 end
Nenue@28 517 end
Nenue@28 518
Nenue@40 519
Nenue@28 520
Nenue@28 521 ObjectiveTrackerFrame:UnregisterAllEvents()
Nenue@28 522 ObjectiveTrackerFrame:Hide()
Nenue@33 523 _G.MinimapCluster:Hide()
Nenue@28 524
Nenue@28 525 for id, name in ipairs(T.orderedNames) do
Nenue@28 526 if not T.orderedHandlers[id] then
Nenue@28 527 Handler_Initialize(T.DefaultHandler, name, id)
Nenue@28 528 end
Nenue@28 529 end
Nenue@28 530 self:SetSize(c.Width, 40)
Nenue@28 531 T.InitializeWidgets()
Nenue@28 532 end
Nenue@28 533
Nenue@28 534 --- Done any time the the minimize button is toggled up
Nenue@28 535 function T:OnEnable()
Nenue@28 536
Nenue@28 537 print(B.Conf.VeneerObjectiveWrapper.enabled)
Nenue@34 538
Nenue@28 539
Nenue@28 540 for event, action in pairs(Event) do
Nenue@28 541 print('|cFFFF0088listen to', event, 'for action|r', tostring(action))
Nenue@28 542 Wrapper:RegisterEvent(event)
Nenue@28 543 end
Nenue@28 544
Nenue@28 545 local c = T.Conf.Wrapper
Nenue@30 546 Wrapper.previousHeight = 0
Nenue@28 547 Scroller:SetScrollChild(Scroll)
Nenue@28 548 Scroller:SetWidth(c.Width)
Nenue@28 549 Scroll:SetWidth(c.Width)
Nenue@28 550 Scroll:ClearAllPoints()
Nenue@28 551 Scroll:SetPoint('TOP', Scroller, 'TOP')
Nenue@28 552 self:SetScript('OnEvent', T.OnEvent)
Nenue@28 553
Nenue@28 554 Scroller:Show()
Nenue@28 555
Nenue@28 556 local from, target, to, x, y = Wrapper:GetPoint(1)
Nenue@38 557 print(from, target, to, x,y)
Nenue@28 558
Nenue@28 559
Nenue@38 560 T.UpdateSchema('tracker', 'default')
Nenue@28 561 -- run once to prime the data structure
Nenue@28 562 T.UpdateActionButtons()
Nenue@28 563 end
Nenue@28 564
Nenue@28 565 function T:OnDisable()
Nenue@28 566 self:UnregisterAllEvents()
Nenue@28 567 Scroller:Hide()
Nenue@28 568 end
Nenue@28 569