annotate ObjectiveTracker/ObjectiveCore.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 4b3da1b221de
children
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@25 195 local c = T.Conf.Wrapper
Nenue@19 196 print('Initializing |cFF00FFFF'..name..'|r module...')
Nenue@16 197
Nenue@24 198 local handler = setmetatable(T[name] or {}, {
Nenue@19 199 __tostring = Tracker_string,
Nenue@19 200 __call = Tracker_call
Nenue@0 201 })
Nenue@24 202 if type(T.orderedHandlers[index]) == 'table' then
Nenue@24 203 return T.orderedHandlers[index]
Nenue@0 204 end
Nenue@0 205
Nenue@19 206 print('|cFFFFFF00Acquiring locals')
Nenue@0 207 local preset = {}
Nenue@19 208 for k, _ in pairs(handler) do
Nenue@0 209 preset[k] = true
Nenue@0 210 end
Nenue@0 211
Nenue@16 212
Nenue@19 213 print('|cFFFF8800Inheriting')
Nenue@0 214 for k, v in pairs(self) do
Nenue@0 215 if not handler[k] then
Nenue@0 216 if type(v) == 'table' then
Nenue@0 217 -- assume all tables to be local data; don't inherit or ref
Nenue@0 218 handler[k] = {}
Nenue@0 219 else
Nenue@19 220 handler[k] = self[k]
Nenue@0 221 end
Nenue@19 222 print('copying', k)
Nenue@0 223 end
Nenue@0 224 end
Nenue@0 225 print('|cFFFF4400'..tostring(name)..'|r:')
Nenue@0 226 for k, v in pairs(handler) do
Nenue@19 227 print(format("%32s %8s %s", (preset[k] and '|cFFFFFFFF' or '|cFFFFFF00') .. k .. '|r', type(v), tostring(v)))
Nenue@0 228 end
Nenue@16 229
Nenue@24 230 T[name] = handler
Nenue@16 231
Nenue@19 232 local trackerName = 'Veneer'..name..'Tracker'
Nenue@24 233 local handler = T[name]
Nenue@19 234 local frame = CreateFrame('Frame', trackerName, _G.VeneerObjectiveScroll, 'VeneerTrackerTemplate')
Nenue@19 235 frame.title:SetText(handler.displayName)
Nenue@25 236 frame:SetWidth(c.Width)
Nenue@19 237 handler.frame = frame
Nenue@19 238 handler.trackerName = trackerName
Nenue@21 239 handler.lines = {}
Nenue@24 240 T.orderedTrackers[index] = frame
Nenue@24 241 T.namedTrackers[name] = frame
Nenue@24 242 T.indexedTrackers[handler] = frame
Nenue@19 243 print('|cFFFF0088' .. trackerName .. '|r created for |cFF00FFFF' .. handler.displayName .. '|r module')
Nenue@19 244
Nenue@24 245 T.orderedHandlers[index] = handler
Nenue@0 246 return true
Nenue@0 247 end
Nenue@0 248
Nenue@22 249 local Event = {}
Nenue@22 250 Event.QUEST_LOG_UPDATE = function()
Nenue@22 251 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE
Nenue@22 252 end
Nenue@22 253 Event.QUEST_ACCEPTED = function(questLogIndex, questID)
Nenue@22 254 if ( IsQuestTask(questID) ) then
Nenue@22 255 return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED, questID
Nenue@22 256 else
Nenue@22 257 if ( AUTO_QUEST_WATCH == "1" and GetNumQuestWatches() < MAX_WATCHABLE_QUESTS ) then
Nenue@22 258 AddQuestWatch(questLogIndex);
Nenue@22 259 SetSuperTrackedQuestID(questID);
Nenue@22 260 end
Nenue@22 261 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST
Nenue@22 262 end
Nenue@22 263 end
Nenue@23 264
Nenue@22 265 Event.QUEST_WATCH_LIST_CHANGED = function(questID, added)
Nenue@22 266 if ( added ) then
Nenue@22 267 if ( not IsQuestTask(questID) ) then
Nenue@22 268 return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added
Nenue@22 269 end
Nenue@22 270 else
Nenue@22 271 return OBJECTIVE_TRACKER_UPDATE_QUEST, questID, added
Nenue@22 272 end
Nenue@22 273 end
Nenue@23 274
Nenue@22 275 Event.QUEST_POI_UPDATE = function()
Nenue@22 276 QuestPOIUpdateIcons();
Nenue@22 277 if ( GetCVar("trackQuestSorting") == "proximity" ) then
Nenue@22 278 SortQuestWatches();
Nenue@22 279 end
Nenue@22 280 return OBJECTIVE_TRACKER_UPDATE_ALL
Nenue@22 281 end
Nenue@22 282 Event.SUPER_TRACKED_QUEST_CHANGED = function()
Nenue@22 283 return OBJECTIVE_TRACKER_UPDATE_QUEST
Nenue@22 284 end
Nenue@22 285 Event.ZONE_CHANGED = function()
Nenue@21 286
Nenue@22 287 local inMicroDungeon = IsPlayerInMicroDungeon();
Nenue@24 288 if ( inMicroDungeon ~= T.inMicroDungeon ) then
Nenue@19 289 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
Nenue@19 290 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker
Nenue@19 291 end
Nenue@22 292 --SortQuestWatches();
Nenue@24 293 T.inMicroDungeon = inMicroDungeon;
Nenue@0 294 end
Nenue@0 295 end
Nenue@22 296 Event.QUEST_AUTOCOMPLETE = function(questId)
Nenue@22 297 AddAutoQuestPopUp(questId, "COMPLETE");
Nenue@22 298 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP
Nenue@22 299 end
Nenue@22 300 Event.SCENARIO_CRITERIA_UPDATE = function()
Nenue@22 301 return OBJECTIVE_TRACKER_UPDATE_SCENARIO
Nenue@22 302 end
Nenue@22 303 Event.SCENARIO_UPDATE = function(newStage)
Nenue@22 304 if ( newStage ) then
Nenue@22 305 return OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE
Nenue@22 306 else
Nenue@22 307 return OBJECTIVE_TRACKER_UPDATE_SCENARIO
Nenue@22 308 end
Nenue@22 309 end
Nenue@22 310 Event.TRACKED_ACHIEVEMENT_UPDATE = function()
Nenue@22 311 return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT
Nenue@22 312 end
Nenue@22 313 Event.TRACKED_ACHIEVEMENT_LIST_CHANGED = function(achievementID, added)
Nenue@22 314 if ( added ) then
Nenue@22 315 return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED, achievementID
Nenue@22 316 else
Nenue@22 317 return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT
Nenue@22 318 end
Nenue@22 319 end
Nenue@22 320 Event.ZONE_CHANGED_NEW_AREA = function ()
Nenue@22 321 if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
Nenue@22 322 SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker
Nenue@22 323 end
Nenue@22 324 SortQuestWatches();
Nenue@24 325 T.currentZoneArea = GetCurrentMapAreaID()
Nenue@24 326 print('Updating zone ID to', T.currentZoneArea, '=', GetZoneText(), GetMinimapZoneText())
Nenue@22 327
Nenue@22 328
Nenue@22 329 return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED
Nenue@22 330 end
Nenue@22 331
Nenue@22 332
Nenue@22 333 Event.PLAYER_MONEY = function()
Nenue@24 334 if T.watchMoneyReasons > 0 then
Nenue@24 335 return T.watchMoneyReasons
Nenue@22 336 end
Nenue@22 337 end
Nenue@22 338 Event.CRITERIA_COMPLETE = function()
Nenue@22 339 return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE
Nenue@22 340 end
Nenue@22 341 Event.QUEST_TURN_IN = function(questID, xp, money)
Nenue@22 342 if ( IsQuestTask(questID) ) then
Nenue@24 343 T.Bonus:OnTurnIn(questID, xp, money)
Nenue@22 344 print('updating bonus modules (code', OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, ',', questID, xp, money)
Nenue@22 345 return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, questID, xp, money
Nenue@22 346 else
Nenue@22 347 return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST, questID, xp, money
Nenue@22 348 end
Nenue@22 349 end
Nenue@24 350 T.Event = Event
Nenue@0 351
Nenue@19 352 --- Done once per ui load
Nenue@19 353 local BlizzHooks = {
Nenue@19 354 ['AddQuestWatch'] = 'AddQuestWatch',
Nenue@19 355 ['RemoveQuestWatch'] = 'RemoveQuestWatch',
Nenue@19 356 ['AbandonQuest'] = 'AbandonQuest',
Nenue@19 357 ['AcknowledgeAutoAcceptQuest'] = 'AcknowledgeAutoAcceptQuest',
Nenue@19 358 ['AddAutoQuestPopUp'] = 'AddAutoQuestPopUp',
Nenue@19 359 ['RemoveAutoQuestPopUp'] = 'RemoveAutoQuestPopUp',
Nenue@19 360 ['AddTrackedAchievement'] = 'AddTrackedAchievement',
Nenue@19 361 ['RemoveTrackedAchievement'] = 'RemoveTrackedAchievement',
Nenue@19 362 ['SetSuperTrackedQuestID'] = 'SetSuperTrackedQuestID'
Nenue@19 363 }
Nenue@19 364 local VeneerData
Nenue@22 365
Nenue@24 366 T.SetWatchMoney = function(watchMoney, reason)
Nenue@22 367 if watchMoney then
Nenue@24 368 if band(T.watchMoneyReasons, reason) == 0 then
Nenue@24 369 T.watchMoneyReasons = T.watchMoneyReasons + reason;
Nenue@22 370 end
Nenue@22 371 else
Nenue@24 372 if band(T.watchMoneyReasons, reason) > 0 then
Nenue@24 373 T.watchMoneyReasons = T.watchMoneyReasons - reason;
Nenue@22 374 end
Nenue@22 375 end
Nenue@22 376 end
Nenue@24 377 T.animateReasons = 0
Nenue@25 378 T.SetAnimate = function(reason)
Nenue@25 379 print('comparing', T.animateReasons, reason)
Nenue@23 380 if animate then
Nenue@24 381 if band(T.animateReasons, reason) == 0 then
Nenue@24 382 T.animateReasons = T.animateReasons + reason
Nenue@23 383 end
Nenue@23 384 else
Nenue@24 385 if band(T.animateReasons, reason) > 0 then
Nenue@24 386 T.animateReasons = T.animateReasons - reason
Nenue@23 387 end
Nenue@23 388 end
Nenue@23 389 end
Nenue@22 390
Nenue@23 391 local Play = function(file) if Devian and Devian.InWorkspace() then PlaySoundFile(file) end end
Nenue@23 392
Nenue@24 393 function T:OnEvent (event, ...)
Nenue@22 394 local isHandled
Nenue@22 395 print('OnEvent(|cFF00FF00'.. event ..'|r):', ...)
Nenue@22 396 local reason, arg1, arg2, arg3
Nenue@22 397 if Event[event] then
Nenue@22 398 if type(Event[event]) == 'function' then
Nenue@23 399 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Info.ogg]])
Nenue@22 400 reason, arg1, arg2, arg3 = Event[event](...)
Nenue@22 401 elseif type(Event[event]) == 'table' then
Nenue@23 402 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Link.ogg]])
Nenue@22 403 for i, action in ipairs(Event[event]) do
Nenue@22 404 if type(action) == 'function' then
Nenue@22 405 reason, arg1, arg2, arg3 = action(event, ...)
Nenue@22 406 else
Nenue@22 407 reason = action
Nenue@22 408 end
Nenue@22 409
Nenue@22 410 if reason then
Nenue@24 411 T:Update(reason, arg1, arg2, arg3)
Nenue@22 412 end
Nenue@22 413 end
Nenue@22 414 else
Nenue@23 415 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Heart.ogg]])
Nenue@22 416 reason = Event[event]
Nenue@22 417 end
Nenue@22 418 else
Nenue@23 419 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]])
Nenue@22 420 end
Nenue@22 421 if reason then
Nenue@24 422 T:Update(reason, arg1, arg2, arg3)
Nenue@22 423 else
Nenue@22 424 print('no reason value returned')
Nenue@23 425 Play([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]])
Nenue@22 426 end
Nenue@24 427
Nenue@24 428 end
Nenue@24 429
Nenue@24 430
Nenue@24 431 function T:OnInitialize()
Nenue@24 432 local c = T.Conf.Wrapper
Nenue@24 433 VeneerData = _G.VeneerData
Nenue@24 434 VeneerData.CallLog = VeneerData.CallLog or {}
Nenue@24 435 if not T.isHooked then
Nenue@24 436 T.isHooked = true
Nenue@24 437 for blizzFunc, veneerFunc in pairs(BlizzHooks) do
Nenue@24 438 if T[veneerFunc] then
Nenue@24 439 hooksecurefunc(blizzFunc, T[veneerFunc])
Nenue@24 440 else
Nenue@24 441 hooksecurefunc(blizzFunc, function(...)
Nenue@24 442 print('|cFFFF0088securehook('..tostring(blizzFunc)..')|r args:', ...)
Nenue@24 443 tinsert(VeneerData.CallLog, {blizzFunc, ...})
Nenue@24 444 end)
Nenue@24 445 end
Nenue@24 446 end
Nenue@24 447 end
Nenue@24 448
Nenue@24 449 T.Conf.TasksLog = T.Conf.TasksLog or {}
Nenue@24 450
Nenue@24 451 ObjectiveTrackerFrame:UnregisterAllEvents()
Nenue@24 452 ObjectiveTrackerFrame:Hide()
Nenue@24 453
Nenue@24 454
Nenue@24 455 for id, name in ipairs(T.orderedNames) do
Nenue@24 456 if not T.orderedHandlers[id] then
Nenue@24 457 Handler_Initialize(T.DefaultHandler, name, id)
Nenue@24 458 end
Nenue@24 459 end
Nenue@24 460 self:SetSize(c.Width, 40)
Nenue@24 461 T.InitializeWidgets()
Nenue@22 462 end
Nenue@22 463
Nenue@19 464 --- Done any time the the minimize button is toggled up
Nenue@24 465 function T:OnEnable()
Nenue@24 466
Nenue@24 467 print(B.Conf.VeneerObjectiveWrapper.enabled)
Nenue@24 468 if not B.Conf.VeneerObjectiveWrapper.enabled then
Nenue@24 469 return
Nenue@19 470 end
Nenue@19 471
Nenue@22 472 for event, action in pairs(Event) do
Nenue@22 473 print('|cFFFF0088listen to', event, 'for action|r', tostring(action))
Nenue@22 474 Wrapper:RegisterEvent(event)
Nenue@22 475 end
Nenue@22 476
Nenue@24 477 local c = T.Conf.Wrapper
Nenue@19 478
Nenue@24 479 Scroller:SetScrollChild(Scroll)
Nenue@24 480 Scroller:SetWidth(c.Width)
Nenue@24 481 Scroll:SetWidth(c.Width)
Nenue@24 482 Scroll:ClearAllPoints()
Nenue@24 483 Scroll:SetPoint('TOP', Scroller, 'TOP')
Nenue@24 484 self:SetScript('OnEvent', T.OnEvent)
Nenue@23 485
Nenue@24 486 Scroller:Show()
Nenue@23 487
Nenue@24 488 local from, target, to, x, y = Wrapper:GetPoint(1)
Nenue@24 489 print(from, target:GetName(), to, x,y)
Nenue@24 490
Nenue@24 491 T:Update()
Nenue@24 492
Nenue@24 493 -- run once to prime the data structure
Nenue@24 494 T.UpdateActionButtons()
Nenue@19 495 end
Nenue@19 496
Nenue@24 497 function T:OnDisable()
Nenue@24 498 self:UnregisterAllEvents()
Nenue@24 499 Scroller:Hide()
Nenue@19 500 end
Nenue@19 501