annotate ObjectiveTracker/ObjectiveCore.lua @ 24:66b927b46776

Refine the XML data logic, and sort out some EnableMouse inconsistencies.
author Nenue
date Mon, 11 Apr 2016 09:07:40 -0400
parents e837384ac363
children 4b3da1b221de
rev   line source
Nenue@0 1 --- ${PACKAGE_NAME}
Nenue@0 2 -- @file-author@
Nenue@0 3 -- @project-revision@ @project-hash@
Nenue@0 4 -- @file-revision@ @file-hash@
Nenue@0 5 -- Created: 3/26/2016 1:51 AM
Nenue@19 6 local B, _G = select(2,...).frame, _G
Nenue@22 7 local pairs, setmetatable, type, tostring, band, format = _G.pairs, _G.setmetatable, _G.type, _G.tostring, bit.band, string.format
Nenue@22 8 local ipairs, tinsert, hooksecurefunc = _G.ipairs, _G.tinsert, _G.hooksecurefunc
Nenue@22 9 local PlaySoundFile, IsQuestTask, SortQuestWatches, GetCurrentMapAreaID, GetZoneText, GetMinimapZoneText = PlaySoundFile, IsQuestTask, SortQuestWatches, GetCurrentMapAreaID, GetZoneText, GetMinimapZoneText
Nenue@22 10 local AddQuestWatch, SetSuperTrackedQuestID, GetNumQuestWatches, AUTO_QUEST_WATCH, MAX_WATCHABLE_QUESTS = AddQuestWatch, SetSuperTrackedQuestID, GetNumQuestWatches, AUTO_QUEST_WATCH, MAX_WATCHABLE_QUESTS
Nenue@22 11 local QuestPOIUpdateIcons, GetCVar, IsPlayerInMicroDungeon, WorldMapFrame, GetCVarBool, SetMapToCurrentZone = QuestPOIUpdateIcons, GetCVar, IsPlayerInMicroDungeon, WorldMapFrame, GetCVarBool, SetMapToCurrentZone
Nenue@22 12 local AddAutoQuestPopUp = AddAutoQuestPopUp
Nenue@24 13 local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
Nenue@0 14 local print = B.print('Objectives')
Nenue@19 15 local ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame = _G.ObjectiveTrackerFrame, _G.VeneerObjectiveScroll, _G.CreateFrame
Nenue@19 16 local Wrapper = _G.VeneerObjectiveWrapper
Nenue@19 17 local Scroller = VeneerObjectiveWrapper.scrollArea
Nenue@19 18 local Scroll = _G.VeneerObjectiveScroll
Nenue@16 19
Nenue@16 20 --- Performance values
Nenue@16 21 --[[
Nenue@16 22 self:RegisterEvent("QUEST_LOG_UPDATE");
Nenue@16 23 self:RegisterEvent("TRACKED_ACHIEVEMENT_LIST_CHANGED");
Nenue@16 24 self:RegisterEvent("QUEST_WATCH_LIST_CHANGED");
Nenue@16 25 self:RegisterEvent("QUEST_AUTOCOMPLETE");
Nenue@16 26 self:RegisterEvent("QUEST_ACCEPTED");
Nenue@16 27 self:RegisterEvent("SUPER_TRACKED_QUEST_CHANGED");
Nenue@16 28 self:RegisterEvent("SCENARIO_UPDATE");
Nenue@16 29 self:RegisterEvent("SCENARIO_CRITERIA_UPDATE");
Nenue@16 30 self:RegisterEvent("TRACKED_ACHIEVEMENT_UPDATE");
Nenue@16 31 self:RegisterEvent("ZONE_CHANGED_NEW_AREA");
Nenue@16 32 self:RegisterEvent("ZONE_CHANGED");
Nenue@16 33 self:RegisterEvent("QUEST_POI_UPDATE");
Nenue@16 34 self:RegisterEvent("VARIABLES_LOADED");
Nenue@16 35 self:RegisterEvent("QUEST_TURNED_IN");
Nenue@16 36 self:RegisterEvent("PLAYER_MONEY");
Nenue@16 37 ]]
Nenue@16 38
Nenue@19 39
Nenue@19 40 --- These are the bitfields used by Blizzard_ObjectiveTracker to determine which segments get parsed.
Nenue@19 41 --- They are replicated here so that plugins can make use of any securehook args involving this info.
Nenue@19 42 local OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST -- 0x0100
Nenue@19 43 local OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP = OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP -- 0x0200
Nenue@19 44 local OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE -- 0x0400
Nenue@19 45 local OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO = OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO -- 0x0800
Nenue@19 46 local OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT = OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT -- 0x1000
Nenue@19 47
Nenue@19 48
Nenue@19 49 local OBJECTIVE_TRACKER_UPDATE_STATIC = OBJECTIVE_TRACKER_UPDATE_STATIC -- 0x0000
Nenue@19 50 local OBJECTIVE_TRACKER_UPDATE_ALL = OBJECTIVE_TRACKER_UPDATE_ALL -- 0xFFFF
Nenue@19 51 local OBJECTIVE_TRACKER_UPDATE_ID = OBJECTIVE_TRACKER_UPDATE_ID -- 0
Nenue@19 52
Nenue@19 53 local OBJECTIVE_TRACKER_UPDATE_QUEST = OBJECTIVE_TRACKER_UPDATE_QUEST -- 0x0001
Nenue@19 54 local OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED = OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED -- 0x0002
Nenue@19 55 local OBJECTIVE_TRACKER_UPDATE_TASK_ADDED = OBJECTIVE_TRACKER_UPDATE_TASK_ADDED -- 0x0004
Nenue@19 56 local OBJECTIVE_TRACKER_UPDATE_SCENARIO = OBJECTIVE_TRACKER_UPDATE_SCENARIO -- 0x0008
Nenue@19 57 local OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE = OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE -- 0x0010
Nenue@19 58 local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT -- 0x0020
Nenue@19 59 local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED -- 0x0040
Nenue@19 60 local OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED = OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED -- 0x0080
Nenue@19 61
Nenue@19 62 local OBJECTIVE_TRACKER_UPDATE_REASON = OBJECTIVE_TRACKER_UPDATE_ALL -- default
Nenue@19 63 --- Used to determine which trackers are listening for money events
Nenue@24 64
Nenue@24 65 T.strings = {}
Nenue@24 66 T.strings.CLICK_TO_ACCCEPT = 'Click to Accept'
Nenue@24 67 T.strings.CLICK_TO_COMPLETE = 'Click to complete'
Nenue@24 68 T.colors ={
Nenue@24 69 enable = true,
Nenue@24 70 default = {
Nenue@24 71 titlebg = {'HORIZONTAL', 1, 0, .7, .25, 1, 0, .7, .125},
Nenue@24 72 textbg = {'HORIZONTAL', 0, 0, 0, 0.4, 0, 0, 0, 0 },
Nenue@24 73 selectionbg = {'HORIZONTAL', 1, 1, 1, 0, 1, 1, 1, 0.225},
Nenue@24 74 },
Nenue@24 75 daily = {
Nenue@24 76 titlebg = {'HORIZONTAL', 0, .7, 1, .25, 0, 1, .7, .125},
Nenue@24 77 textbg = {'HORIZONTAL', 0, .7, 1, .1, 0, 1, .7, .075 },
Nenue@24 78 },
Nenue@24 79 weekly = {
Nenue@24 80 titlebg = {'HORIZONTAL', 0, .35, .7, .25, 0, .35, .7, .125},
Nenue@24 81 textbg = {'HORIZONTAL', 0, .35, .7, .1, 0, .35, .7, .075 },
Nenue@24 82 },
Nenue@24 83 account = {
Nenue@24 84 titlebg = {'HORIZONTAL', .1, .1, .1, .25, .1, .1, .1, .125},
Nenue@24 85 textbg = {'HORIZONTAL', .1, .1, .1, 0.4, .1, .1, .1, .085 },
Nenue@24 86 },
Nenue@24 87 -- alliance
Nenue@24 88 faction_1 = {
Nenue@24 89 titlebg = {'HORIZONTAL', .2, .4, 1, 0.4, .2, .4, 1, .085 },
Nenue@24 90 textbg = {'HORIZONTAL', .2, .4, 1, 0.4, .2, .4, 1, .085 },
Nenue@24 91 },
Nenue@24 92 -- horde
Nenue@24 93 faction_2 = {
Nenue@24 94 titlebg = {'HORIZONTAL', .6, 0, 0.4, 0.4, .6, 0, 0.4, .085 },
Nenue@24 95 textbg = {'HORIZONTAL', .6, 0, 0.4, 0.4, .6, 0, 0.4, .085 },
Nenue@24 96 }
Nenue@24 97 }
Nenue@24 98
Nenue@24 99 T.watchMoneyReasons = 0
Nenue@0 100
Nenue@19 101 --- Baseline defaults table; values defined in the files that they pertain to
Nenue@24 102 T.defaults = {}
Nenue@10 103
Nenue@19 104 --- Tracker display order
Nenue@24 105 T.orderedNames = {'Bonus', 'AutoQuest', 'Quest', 'Cheevs'}
Nenue@0 106
Nenue@19 107 --- ipairs() argument tables
Nenue@24 108 T.orderedHandlers = setmetatable({}, {__mode = "k"})
Nenue@24 109 T.orderedTrackers = setmetatable({}, {__mode = "k"})
Nenue@24 110 T.indexedTrackers = setmetatable({}, {__mode = "k"})
Nenue@0 111
Nenue@19 112 --- pairs() argument tables
Nenue@24 113 T.namedTrackers = setmetatable({}, {__mode = "k"})
Nenue@19 114
Nenue@19 115 local WRAPPER_ANCHOR_POINT = 'TOPRIGHT'
Nenue@19 116 local WRAPPER_OFFSET_X = 0
Nenue@19 117 local WRAPPER_OFFSET_Y = -200
Nenue@19 118 local WRAPPER_MAX_HEIGHT = 670
Nenue@19 119 local WRAPPER_WIDTH = 280
Nenue@19 120 local WRAPPER_HEADER_HEIGHT = 24
Nenue@19 121
Nenue@24 122 T.defaults.Wrapper = {
Nenue@19 123 AnchorPoint = WRAPPER_ANCHOR_POINT,
Nenue@19 124 OffsetX = WRAPPER_OFFSET_X,
Nenue@19 125 OffsetY = WRAPPER_OFFSET_Y,
Nenue@19 126 Height = WRAPPER_MAX_HEIGHT,
Nenue@19 127 Width = WRAPPER_WIDTH,
Nenue@21 128 HeaderHeight = WRAPPER_HEADER_HEIGHT,
Nenue@21 129 TextSpacing = 3,
Nenue@21 130 TitleSpacing = 3,
Nenue@19 131 }
Nenue@21 132
Nenue@21 133
Nenue@21 134
Nenue@19 135 --- Tracker module definitions begin here; innards dealing with data retreival and output are defined further in
Nenue@24 136 T.DefaultHandler = {
Nenue@19 137 previousHeight = 0,
Nenue@19 138
Nenue@19 139 name = "temp",
Nenue@19 140 displayName = "temp",
Nenue@19 141 updateReasonModule = 0xFF00,
Nenue@19 142 updateReasonEvent = 0x00FF,
Nenue@19 143
Nenue@19 144 numWatched = 0, --- number of entries being handled
Nenue@19 145 numBlocks = 0, --- number of blocks created
Nenue@19 146 actualBlocks = 0, --- number of blocks in use
Nenue@19 147
Nenue@19 148 freeBlocks = {}, --- block heap
Nenue@19 149 usedBlocks = {},
Nenue@19 150
Nenue@19 151 Info = {}, -- find data by ID
Nenue@19 152 BlockInfo = {}, -- find data by block ID
Nenue@19 153 Watched = {}, -- find watchIndex by data ID
Nenue@19 154 WatchInfo = {}, -- find data by watch index
Nenue@19 155 WatchBlock = {}, -- find block by watch index
Nenue@19 156 }
Nenue@19 157
Nenue@24 158 T.AutoQuest = {
Nenue@14 159 name = "AutoQuest",
Nenue@16 160 displayName = "Notice",
Nenue@19 161 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST,
Nenue@19 162 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST +
Nenue@19 163 OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED,
Nenue@0 164 }
Nenue@24 165 T.Quest = {
Nenue@14 166 name = "Quest",
Nenue@14 167 displayName = "Quests",
Nenue@19 168 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST,
Nenue@19 169 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST +
Nenue@19 170 OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED,
Nenue@24 171 itemButtons = {},
Nenue@24 172 freeButtons = {},
Nenue@0 173 }
Nenue@24 174 T.Cheevs = {
Nenue@14 175 name = "Cheevs",
Nenue@14 176 displayName = "Achievements",
Nenue@19 177 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT,
Nenue@19 178 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT +
Nenue@19 179 OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED,
Nenue@14 180 }
Nenue@24 181 T.Bonus = {
Nenue@14 182 name = "Bonus",
Nenue@14 183 displayName = "Bonus Objectives",
Nenue@19 184 updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE,
Nenue@22 185 updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST + OBJECTIVE_TRACKER_UPDATE_TASK_ADDED
Nenue@0 186 }
Nenue@0 187
Nenue@19 188 local Tracker_string = function (self)
Nenue@19 189 return self.name
Nenue@19 190 end
Nenue@19 191 local Tracker_call = function (self, reason)
Nenue@19 192 self:Update(reason)
Nenue@19 193 end
Nenue@21 194 local Handler_Initialize = function (self, name, index)
Nenue@19 195 print('Initializing |cFF00FFFF'..name..'|r module...')
Nenue@16 196
Nenue@24 197 local handler = setmetatable(T[name] or {}, {
Nenue@19 198 __tostring = Tracker_string,
Nenue@19 199 __call = Tracker_call
Nenue@0 200 })
Nenue@24 201 if type(T.orderedHandlers[index]) == 'table' then
Nenue@24 202 return T.orderedHandlers[index]
Nenue@0 203 end
Nenue@0 204
Nenue@19 205 print('|cFFFFFF00Acquiring locals')
Nenue@0 206 local preset = {}
Nenue@19 207 for k, _ in pairs(handler) do
Nenue@0 208 preset[k] = true
Nenue@0 209 end
Nenue@0 210
Nenue@16 211
Nenue@19 212 print('|cFFFF8800Inheriting')
Nenue@0 213 for k, v in pairs(self) do
Nenue@0 214 if not handler[k] then
Nenue@0 215 if type(v) == 'table' then
Nenue@0 216 -- assume all tables to be local data; don't inherit or ref
Nenue@0 217 handler[k] = {}
Nenue@0 218 else
Nenue@19 219 handler[k] = self[k]
Nenue@0 220 end
Nenue@19 221 print('copying', k)
Nenue@0 222 end
Nenue@0 223 end
Nenue@0 224 print('|cFFFF4400'..tostring(name)..'|r:')
Nenue@0 225 for k, v in pairs(handler) do
Nenue@19 226 print(format("%32s %8s %s", (preset[k] and '|cFFFFFFFF' or '|cFFFFFF00') .. k .. '|r', type(v), tostring(v)))
Nenue@0 227 end
Nenue@16 228
Nenue@24 229 T[name] = handler
Nenue@16 230
Nenue@19 231 local trackerName = 'Veneer'..name..'Tracker'
Nenue@24 232 local handler = T[name]
Nenue@19 233 local frame = CreateFrame('Frame', trackerName, _G.VeneerObjectiveScroll, 'VeneerTrackerTemplate')
Nenue@19 234 frame.title:SetText(handler.displayName)
Nenue@24 235 T.SetBlockStyle(frame, 'Tracker', 'Normal')
Nenue@19 236 handler.frame = frame
Nenue@19 237 handler.trackerName = trackerName
Nenue@21 238 handler.lines = {}
Nenue@24 239 T.orderedTrackers[index] = frame
Nenue@24 240 T.namedTrackers[name] = frame
Nenue@24 241 T.indexedTrackers[handler] = frame
Nenue@19 242 print('|cFFFF0088' .. trackerName .. '|r created for |cFF00FFFF' .. handler.displayName .. '|r module')
Nenue@19 243
Nenue@24 244 T.orderedHandlers[index] = handler
Nenue@0 245 return true
Nenue@0 246 end
Nenue@0 247
Nenue@22 248 local Event = {}
Nenue@22 249 Event.QUEST_LOG_UPDATE = function()
Nenue@22 250 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE
Nenue@22 251 end
Nenue@22 252 Event.QUEST_ACCEPTED = function(questLogIndex, questID)
Nenue@22 253 if ( IsQuestTask(questID) ) then
Nenue@22 254 return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED, questID
Nenue@22 255 else
Nenue@22 256 if ( AUTO_QUEST_WATCH == "1" and GetNumQuestWatches() < MAX_WATCHABLE_QUESTS ) then
Nenue@22 257 AddQuestWatch(questLogIndex);
Nenue@22 258 SetSuperTrackedQuestID(questID);
Nenue@22 259 end
Nenue@22 260 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST
Nenue@22 261 end
Nenue@22 262 end
Nenue@23 263
Nenue@22 264 Event.QUEST_WATCH_LIST_CHANGED = function(questID, added)
Nenue@22 265 if ( added ) then
Nenue@22 266 if ( not IsQuestTask(questID) ) then
Nenue@22 267 return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added
Nenue@22 268 end
Nenue@22 269 else
Nenue@22 270 return OBJECTIVE_TRACKER_UPDATE_QUEST, questID, added
Nenue@22 271 end
Nenue@22 272 end
Nenue@23 273
Nenue@22 274 Event.QUEST_POI_UPDATE = function()
Nenue@22 275 QuestPOIUpdateIcons();
Nenue@22 276 if ( GetCVar("trackQuestSorting") == "proximity" ) then
Nenue@22 277 SortQuestWatches();
Nenue@22 278 end
Nenue@22 279 return OBJECTIVE_TRACKER_UPDATE_ALL
Nenue@22 280 end
Nenue@22 281 Event.SUPER_TRACKED_QUEST_CHANGED = function()
Nenue@22 282 return OBJECTIVE_TRACKER_UPDATE_QUEST
Nenue@22 283 end
Nenue@22 284 Event.ZONE_CHANGED = function()
Nenue@21 285
Nenue@22 286 local inMicroDungeon = IsPlayerInMicroDungeon();
Nenue@24 287 if ( inMicroDungeon ~= T.inMicroDungeon ) then
Nenue@19 288 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
Nenue@19 289 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker
Nenue@19 290 end
Nenue@22 291 --SortQuestWatches();
Nenue@24 292 T.inMicroDungeon = inMicroDungeon;
Nenue@0 293 end
Nenue@0 294 end
Nenue@22 295 Event.QUEST_AUTOCOMPLETE = function(questId)
Nenue@22 296 AddAutoQuestPopUp(questId, "COMPLETE");
Nenue@22 297 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP
Nenue@22 298 end
Nenue@22 299 Event.SCENARIO_CRITERIA_UPDATE = function()
Nenue@22 300 return OBJECTIVE_TRACKER_UPDATE_SCENARIO
Nenue@22 301 end
Nenue@22 302 Event.SCENARIO_UPDATE = function(newStage)
Nenue@22 303 if ( newStage ) then
Nenue@22 304 return OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE
Nenue@22 305 else
Nenue@22 306 return OBJECTIVE_TRACKER_UPDATE_SCENARIO
Nenue@22 307 end
Nenue@22 308 end
Nenue@22 309 Event.TRACKED_ACHIEVEMENT_UPDATE = function()
Nenue@22 310 return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT
Nenue@22 311 end
Nenue@22 312 Event.TRACKED_ACHIEVEMENT_LIST_CHANGED = function(achievementID, added)
Nenue@22 313 if ( added ) then
Nenue@22 314 return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED, achievementID
Nenue@22 315 else
Nenue@22 316 return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT
Nenue@22 317 end
Nenue@22 318 end
Nenue@22 319 Event.ZONE_CHANGED_NEW_AREA = function ()
Nenue@22 320 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
Nenue@22 321 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker
Nenue@22 322 end
Nenue@22 323 SortQuestWatches();
Nenue@24 324 T.currentZoneArea = GetCurrentMapAreaID()
Nenue@24 325 print('Updating zone ID to', T.currentZoneArea, '=', GetZoneText(), GetMinimapZoneText())
Nenue@22 326
Nenue@22 327
Nenue@22 328 return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED
Nenue@22 329 end
Nenue@22 330
Nenue@22 331
Nenue@22 332 Event.PLAYER_MONEY = function()
Nenue@24 333 if T.watchMoneyReasons > 0 then
Nenue@24 334 return T.watchMoneyReasons
Nenue@22 335 end
Nenue@22 336 end
Nenue@22 337 Event.CRITERIA_COMPLETE = function()
Nenue@22 338 return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE
Nenue@22 339 end
Nenue@22 340 Event.QUEST_TURN_IN = function(questID, xp, money)
Nenue@22 341 if ( IsQuestTask(questID) ) then
Nenue@24 342 T.Bonus:OnTurnIn(questID, xp, money)
Nenue@22 343 print('updating bonus modules (code', OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, ',', questID, xp, money)
Nenue@22 344 return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, questID, xp, money
Nenue@22 345 else
Nenue@22 346 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST, questID, xp, money
Nenue@22 347 end
Nenue@22 348 end
Nenue@24 349 T.Event = Event
Nenue@0 350
Nenue@19 351 --- Done once per ui load
Nenue@19 352 local BlizzHooks = {
Nenue@19 353 ['AddQuestWatch'] = 'AddQuestWatch',
Nenue@19 354 ['RemoveQuestWatch'] = 'RemoveQuestWatch',
Nenue@19 355 ['AbandonQuest'] = 'AbandonQuest',
Nenue@19 356 ['AcknowledgeAutoAcceptQuest'] = 'AcknowledgeAutoAcceptQuest',
Nenue@19 357 ['AddAutoQuestPopUp'] = 'AddAutoQuestPopUp',
Nenue@19 358 ['RemoveAutoQuestPopUp'] = 'RemoveAutoQuestPopUp',
Nenue@19 359 ['AddTrackedAchievement'] = 'AddTrackedAchievement',
Nenue@19 360 ['RemoveTrackedAchievement'] = 'RemoveTrackedAchievement',
Nenue@19 361 ['SetSuperTrackedQuestID'] = 'SetSuperTrackedQuestID'
Nenue@19 362 }
Nenue@19 363 local VeneerData
Nenue@22 364
Nenue@24 365 T.SetWatchMoney = function(watchMoney, reason)
Nenue@22 366 if watchMoney then
Nenue@24 367 if band(T.watchMoneyReasons, reason) == 0 then
Nenue@24 368 T.watchMoneyReasons = T.watchMoneyReasons + reason;
Nenue@22 369 end
Nenue@22 370 else
Nenue@24 371 if band(T.watchMoneyReasons, reason) > 0 then
Nenue@24 372 T.watchMoneyReasons = T.watchMoneyReasons - reason;
Nenue@22 373 end
Nenue@22 374 end
Nenue@22 375 end
Nenue@24 376 T.animateReasons = 0
Nenue@24 377 T.SetAnimate = function(animate, reason)
Nenue@23 378 if animate then
Nenue@24 379 if band(T.animateReasons, reason) == 0 then
Nenue@24 380 T.animateReasons = T.animateReasons + reason
Nenue@23 381 end
Nenue@23 382 else
Nenue@24 383 if band(T.animateReasons, reason) > 0 then
Nenue@24 384 T.animateReasons = T.animateReasons - reason
Nenue@23 385 end
Nenue@23 386 end
Nenue@23 387 end
Nenue@22 388
Nenue@23 389 local Play = function(file) if Devian and Devian.InWorkspace() then PlaySoundFile(file) end end
Nenue@23 390
Nenue@24 391 function T:OnEvent (event, ...)
Nenue@22 392 local isHandled
Nenue@22 393 print('OnEvent(|cFF00FF00'.. event ..'|r):', ...)
Nenue@22 394 local reason, arg1, arg2, arg3
Nenue@22 395 if Event[event] then
Nenue@22 396 if type(Event[event]) == 'function' then
Nenue@23 397 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Info.ogg]])
Nenue@22 398 reason, arg1, arg2, arg3 = Event[event](...)
Nenue@22 399 elseif type(Event[event]) == 'table' then
Nenue@23 400 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Link.ogg]])
Nenue@22 401 for i, action in ipairs(Event[event]) do
Nenue@22 402 if type(action) == 'function' then
Nenue@22 403 reason, arg1, arg2, arg3 = action(event, ...)
Nenue@22 404 else
Nenue@22 405 reason = action
Nenue@22 406 end
Nenue@22 407
Nenue@22 408 if reason then
Nenue@24 409 T:Update(reason, arg1, arg2, arg3)
Nenue@22 410 end
Nenue@22 411 end
Nenue@22 412 else
Nenue@23 413 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Heart.ogg]])
Nenue@22 414 reason = Event[event]
Nenue@22 415 end
Nenue@22 416 else
Nenue@23 417 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]])
Nenue@22 418 end
Nenue@22 419 if reason then
Nenue@24 420 T:Update(reason, arg1, arg2, arg3)
Nenue@22 421 else
Nenue@22 422 print('no reason value returned')
Nenue@23 423 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]])
Nenue@22 424 end
Nenue@24 425
Nenue@24 426 end
Nenue@24 427
Nenue@24 428
Nenue@24 429 function T:OnInitialize()
Nenue@24 430 local c = T.Conf.Wrapper
Nenue@24 431 VeneerData = _G.VeneerData
Nenue@24 432 VeneerData.CallLog = VeneerData.CallLog or {}
Nenue@24 433 if not T.isHooked then
Nenue@24 434 T.isHooked = true
Nenue@24 435 for blizzFunc, veneerFunc in pairs(BlizzHooks) do
Nenue@24 436 if T[veneerFunc] then
Nenue@24 437 hooksecurefunc(blizzFunc, T[veneerFunc])
Nenue@24 438 else
Nenue@24 439 hooksecurefunc(blizzFunc, function(...)
Nenue@24 440 print('|cFFFF0088securehook('..tostring(blizzFunc)..')|r args:', ...)
Nenue@24 441 tinsert(VeneerData.CallLog, {blizzFunc, ...})
Nenue@24 442 end)
Nenue@24 443 end
Nenue@24 444 end
Nenue@24 445 end
Nenue@24 446
Nenue@24 447 T.Conf.TasksLog = T.Conf.TasksLog or {}
Nenue@24 448
Nenue@24 449 ObjectiveTrackerFrame:UnregisterAllEvents()
Nenue@24 450 ObjectiveTrackerFrame:Hide()
Nenue@24 451
Nenue@24 452
Nenue@24 453 for id, name in ipairs(T.orderedNames) do
Nenue@24 454 if not T.orderedHandlers[id] then
Nenue@24 455 Handler_Initialize(T.DefaultHandler, name, id)
Nenue@24 456 end
Nenue@24 457 end
Nenue@24 458 self:SetSize(c.Width, 40)
Nenue@24 459 T.InitializeWidgets()
Nenue@22 460 end
Nenue@22 461
Nenue@19 462 --- Done any time the the minimize button is toggled up
Nenue@24 463 function T:OnEnable()
Nenue@24 464
Nenue@24 465 print(B.Conf.VeneerObjectiveWrapper.enabled)
Nenue@24 466 if not B.Conf.VeneerObjectiveWrapper.enabled then
Nenue@24 467 return
Nenue@19 468 end
Nenue@19 469
Nenue@22 470 for event, action in pairs(Event) do
Nenue@22 471 print('|cFFFF0088listen to', event, 'for action|r', tostring(action))
Nenue@22 472 Wrapper:RegisterEvent(event)
Nenue@22 473 end
Nenue@22 474
Nenue@24 475 local c = T.Conf.Wrapper
Nenue@19 476
Nenue@24 477 Scroller:SetScrollChild(Scroll)
Nenue@24 478 Scroller:SetWidth(c.Width)
Nenue@24 479 Scroll:SetWidth(c.Width)
Nenue@24 480 Scroll:ClearAllPoints()
Nenue@24 481 Scroll:SetPoint('TOP', Scroller, 'TOP')
Nenue@24 482 self:SetScript('OnEvent', T.OnEvent)
Nenue@23 483
Nenue@24 484 Scroller:Show()
Nenue@23 485
Nenue@24 486 local from, target, to, x, y = Wrapper:GetPoint(1)
Nenue@24 487 print(from, target:GetName(), to, x,y)
Nenue@24 488
Nenue@24 489 T:Update()
Nenue@24 490
Nenue@24 491 -- run once to prime the data structure
Nenue@24 492 T.UpdateActionButtons()
Nenue@19 493 end
Nenue@19 494
Nenue@24 495 function T:OnDisable()
Nenue@24 496 self:UnregisterAllEvents()
Nenue@24 497 Scroller:Hide()
Nenue@19 498 end
Nenue@19 499