Nenue@0: --- ${PACKAGE_NAME} Nenue@0: -- @file-author@ Nenue@0: -- @project-revision@ @project-hash@ Nenue@0: -- @file-revision@ @file-hash@ Nenue@0: -- Created: 3/26/2016 1:51 AM Nenue@19: local B, _G = select(2,...).frame, _G Nenue@22: local pairs, setmetatable, type, tostring, band, format = _G.pairs, _G.setmetatable, _G.type, _G.tostring, bit.band, string.format Nenue@22: local ipairs, tinsert, hooksecurefunc = _G.ipairs, _G.tinsert, _G.hooksecurefunc Nenue@22: local PlaySoundFile, IsQuestTask, SortQuestWatches, GetCurrentMapAreaID, GetZoneText, GetMinimapZoneText = PlaySoundFile, IsQuestTask, SortQuestWatches, GetCurrentMapAreaID, GetZoneText, GetMinimapZoneText Nenue@22: local AddQuestWatch, SetSuperTrackedQuestID, GetNumQuestWatches, AUTO_QUEST_WATCH, MAX_WATCHABLE_QUESTS = AddQuestWatch, SetSuperTrackedQuestID, GetNumQuestWatches, AUTO_QUEST_WATCH, MAX_WATCHABLE_QUESTS Nenue@22: local QuestPOIUpdateIcons, GetCVar, IsPlayerInMicroDungeon, WorldMapFrame, GetCVarBool, SetMapToCurrentZone = QuestPOIUpdateIcons, GetCVar, IsPlayerInMicroDungeon, WorldMapFrame, GetCVarBool, SetMapToCurrentZone Nenue@22: local AddAutoQuestPopUp = AddAutoQuestPopUp Nenue@24: local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame') Nenue@0: local print = B.print('Objectives') Nenue@19: local ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame = _G.ObjectiveTrackerFrame, _G.VeneerObjectiveScroll, _G.CreateFrame Nenue@19: local Wrapper = _G.VeneerObjectiveWrapper Nenue@19: local Scroller = VeneerObjectiveWrapper.scrollArea Nenue@19: local Scroll = _G.VeneerObjectiveScroll Nenue@16: Nenue@16: --- Performance values Nenue@16: --[[ Nenue@16: self:RegisterEvent("QUEST_LOG_UPDATE"); Nenue@16: self:RegisterEvent("TRACKED_ACHIEVEMENT_LIST_CHANGED"); Nenue@16: self:RegisterEvent("QUEST_WATCH_LIST_CHANGED"); Nenue@16: self:RegisterEvent("QUEST_AUTOCOMPLETE"); Nenue@16: self:RegisterEvent("QUEST_ACCEPTED"); Nenue@16: self:RegisterEvent("SUPER_TRACKED_QUEST_CHANGED"); Nenue@16: self:RegisterEvent("SCENARIO_UPDATE"); Nenue@16: self:RegisterEvent("SCENARIO_CRITERIA_UPDATE"); Nenue@16: self:RegisterEvent("TRACKED_ACHIEVEMENT_UPDATE"); Nenue@16: self:RegisterEvent("ZONE_CHANGED_NEW_AREA"); Nenue@16: self:RegisterEvent("ZONE_CHANGED"); Nenue@16: self:RegisterEvent("QUEST_POI_UPDATE"); Nenue@16: self:RegisterEvent("VARIABLES_LOADED"); Nenue@16: self:RegisterEvent("QUEST_TURNED_IN"); Nenue@16: self:RegisterEvent("PLAYER_MONEY"); Nenue@16: ]] Nenue@16: Nenue@19: Nenue@19: --- These are the bitfields used by Blizzard_ObjectiveTracker to determine which segments get parsed. Nenue@19: --- They are replicated here so that plugins can make use of any securehook args involving this info. Nenue@19: local OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST -- 0x0100 Nenue@19: local OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP = OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP -- 0x0200 Nenue@19: local OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE -- 0x0400 Nenue@19: local OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO = OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO -- 0x0800 Nenue@19: local OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT = OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT -- 0x1000 Nenue@19: Nenue@19: Nenue@19: local OBJECTIVE_TRACKER_UPDATE_STATIC = OBJECTIVE_TRACKER_UPDATE_STATIC -- 0x0000 Nenue@19: local OBJECTIVE_TRACKER_UPDATE_ALL = OBJECTIVE_TRACKER_UPDATE_ALL -- 0xFFFF Nenue@19: local OBJECTIVE_TRACKER_UPDATE_ID = OBJECTIVE_TRACKER_UPDATE_ID -- 0 Nenue@19: Nenue@19: local OBJECTIVE_TRACKER_UPDATE_QUEST = OBJECTIVE_TRACKER_UPDATE_QUEST -- 0x0001 Nenue@19: local OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED = OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED -- 0x0002 Nenue@19: local OBJECTIVE_TRACKER_UPDATE_TASK_ADDED = OBJECTIVE_TRACKER_UPDATE_TASK_ADDED -- 0x0004 Nenue@19: local OBJECTIVE_TRACKER_UPDATE_SCENARIO = OBJECTIVE_TRACKER_UPDATE_SCENARIO -- 0x0008 Nenue@19: local OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE = OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE -- 0x0010 Nenue@19: local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT -- 0x0020 Nenue@19: local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED -- 0x0040 Nenue@19: local OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED = OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED -- 0x0080 Nenue@19: Nenue@19: local OBJECTIVE_TRACKER_UPDATE_REASON = OBJECTIVE_TRACKER_UPDATE_ALL -- default Nenue@19: --- Used to determine which trackers are listening for money events Nenue@24: Nenue@24: T.strings = {} Nenue@24: T.strings.CLICK_TO_ACCCEPT = 'Click to Accept' Nenue@24: T.strings.CLICK_TO_COMPLETE = 'Click to complete' Nenue@24: T.colors ={ Nenue@24: enable = true, Nenue@24: default = { Nenue@24: titlebg = {'HORIZONTAL', 1, 0, .7, .25, 1, 0, .7, .125}, Nenue@24: textbg = {'HORIZONTAL', 0, 0, 0, 0.4, 0, 0, 0, 0 }, Nenue@24: selectionbg = {'HORIZONTAL', 1, 1, 1, 0, 1, 1, 1, 0.225}, Nenue@24: }, Nenue@24: daily = { Nenue@24: titlebg = {'HORIZONTAL', 0, .7, 1, .25, 0, 1, .7, .125}, Nenue@24: textbg = {'HORIZONTAL', 0, .7, 1, .1, 0, 1, .7, .075 }, Nenue@24: }, Nenue@24: weekly = { Nenue@24: titlebg = {'HORIZONTAL', 0, .35, .7, .25, 0, .35, .7, .125}, Nenue@24: textbg = {'HORIZONTAL', 0, .35, .7, .1, 0, .35, .7, .075 }, Nenue@24: }, Nenue@24: account = { Nenue@24: titlebg = {'HORIZONTAL', .1, .1, .1, .25, .1, .1, .1, .125}, Nenue@24: textbg = {'HORIZONTAL', .1, .1, .1, 0.4, .1, .1, .1, .085 }, Nenue@24: }, Nenue@24: -- alliance Nenue@24: faction_1 = { Nenue@24: titlebg = {'HORIZONTAL', .2, .4, 1, 0.4, .2, .4, 1, .085 }, Nenue@24: textbg = {'HORIZONTAL', .2, .4, 1, 0.4, .2, .4, 1, .085 }, Nenue@24: }, Nenue@24: -- horde Nenue@24: faction_2 = { Nenue@24: titlebg = {'HORIZONTAL', .6, 0, 0.4, 0.4, .6, 0, 0.4, .085 }, Nenue@24: textbg = {'HORIZONTAL', .6, 0, 0.4, 0.4, .6, 0, 0.4, .085 }, Nenue@24: } Nenue@24: } Nenue@24: Nenue@24: T.watchMoneyReasons = 0 Nenue@0: Nenue@19: --- Baseline defaults table; values defined in the files that they pertain to Nenue@24: T.defaults = {} Nenue@10: Nenue@19: --- Tracker display order Nenue@24: T.orderedNames = {'Bonus', 'AutoQuest', 'Quest', 'Cheevs'} Nenue@0: Nenue@19: --- ipairs() argument tables Nenue@24: T.orderedHandlers = setmetatable({}, {__mode = "k"}) Nenue@24: T.orderedTrackers = setmetatable({}, {__mode = "k"}) Nenue@24: T.indexedTrackers = setmetatable({}, {__mode = "k"}) Nenue@0: Nenue@19: --- pairs() argument tables Nenue@24: T.namedTrackers = setmetatable({}, {__mode = "k"}) Nenue@19: Nenue@19: local WRAPPER_ANCHOR_POINT = 'TOPRIGHT' Nenue@19: local WRAPPER_OFFSET_X = 0 Nenue@19: local WRAPPER_OFFSET_Y = -200 Nenue@19: local WRAPPER_MAX_HEIGHT = 670 Nenue@19: local WRAPPER_WIDTH = 280 Nenue@19: local WRAPPER_HEADER_HEIGHT = 24 Nenue@19: Nenue@24: T.defaults.Wrapper = { Nenue@19: AnchorPoint = WRAPPER_ANCHOR_POINT, Nenue@19: OffsetX = WRAPPER_OFFSET_X, Nenue@19: OffsetY = WRAPPER_OFFSET_Y, Nenue@19: Height = WRAPPER_MAX_HEIGHT, Nenue@19: Width = WRAPPER_WIDTH, Nenue@21: HeaderHeight = WRAPPER_HEADER_HEIGHT, Nenue@21: TextSpacing = 3, Nenue@21: TitleSpacing = 3, Nenue@19: } Nenue@21: Nenue@21: Nenue@21: Nenue@19: --- Tracker module definitions begin here; innards dealing with data retreival and output are defined further in Nenue@24: T.DefaultHandler = { Nenue@19: previousHeight = 0, Nenue@19: Nenue@19: name = "temp", Nenue@19: displayName = "temp", Nenue@19: updateReasonModule = 0xFF00, Nenue@19: updateReasonEvent = 0x00FF, Nenue@19: Nenue@19: numWatched = 0, --- number of entries being handled Nenue@19: numBlocks = 0, --- number of blocks created Nenue@19: actualBlocks = 0, --- number of blocks in use Nenue@19: Nenue@19: freeBlocks = {}, --- block heap Nenue@19: usedBlocks = {}, Nenue@19: Nenue@19: Info = {}, -- find data by ID Nenue@19: BlockInfo = {}, -- find data by block ID Nenue@19: Watched = {}, -- find watchIndex by data ID Nenue@19: WatchInfo = {}, -- find data by watch index Nenue@19: WatchBlock = {}, -- find block by watch index Nenue@19: } Nenue@19: Nenue@24: T.AutoQuest = { Nenue@14: name = "AutoQuest", Nenue@16: displayName = "Notice", Nenue@19: updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST, Nenue@19: updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST + Nenue@19: OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, Nenue@0: } Nenue@24: T.Quest = { Nenue@14: name = "Quest", Nenue@14: displayName = "Quests", Nenue@19: updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST, Nenue@19: updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST + Nenue@19: OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, Nenue@24: itemButtons = {}, Nenue@24: freeButtons = {}, Nenue@0: } Nenue@24: T.Cheevs = { Nenue@14: name = "Cheevs", Nenue@14: displayName = "Achievements", Nenue@19: updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT, Nenue@19: updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT + Nenue@19: OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED, Nenue@14: } Nenue@24: T.Bonus = { Nenue@14: name = "Bonus", Nenue@14: displayName = "Bonus Objectives", Nenue@19: updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, Nenue@22: updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST + OBJECTIVE_TRACKER_UPDATE_TASK_ADDED Nenue@0: } Nenue@0: Nenue@19: local Tracker_string = function (self) Nenue@19: return self.name Nenue@19: end Nenue@19: local Tracker_call = function (self, reason) Nenue@19: self:Update(reason) Nenue@19: end Nenue@21: local Handler_Initialize = function (self, name, index) Nenue@19: print('Initializing |cFF00FFFF'..name..'|r module...') Nenue@16: Nenue@24: local handler = setmetatable(T[name] or {}, { Nenue@19: __tostring = Tracker_string, Nenue@19: __call = Tracker_call Nenue@0: }) Nenue@24: if type(T.orderedHandlers[index]) == 'table' then Nenue@24: return T.orderedHandlers[index] Nenue@0: end Nenue@0: Nenue@19: print('|cFFFFFF00Acquiring locals') Nenue@0: local preset = {} Nenue@19: for k, _ in pairs(handler) do Nenue@0: preset[k] = true Nenue@0: end Nenue@0: Nenue@16: Nenue@19: print('|cFFFF8800Inheriting') Nenue@0: for k, v in pairs(self) do Nenue@0: if not handler[k] then Nenue@0: if type(v) == 'table' then Nenue@0: -- assume all tables to be local data; don't inherit or ref Nenue@0: handler[k] = {} Nenue@0: else Nenue@19: handler[k] = self[k] Nenue@0: end Nenue@19: print('copying', k) Nenue@0: end Nenue@0: end Nenue@0: print('|cFFFF4400'..tostring(name)..'|r:') Nenue@0: for k, v in pairs(handler) do Nenue@19: print(format("%32s %8s %s", (preset[k] and '|cFFFFFFFF' or '|cFFFFFF00') .. k .. '|r', type(v), tostring(v))) Nenue@0: end Nenue@16: Nenue@24: T[name] = handler Nenue@16: Nenue@19: local trackerName = 'Veneer'..name..'Tracker' Nenue@24: local handler = T[name] Nenue@19: local frame = CreateFrame('Frame', trackerName, _G.VeneerObjectiveScroll, 'VeneerTrackerTemplate') Nenue@19: frame.title:SetText(handler.displayName) Nenue@24: T.SetBlockStyle(frame, 'Tracker', 'Normal') Nenue@19: handler.frame = frame Nenue@19: handler.trackerName = trackerName Nenue@21: handler.lines = {} Nenue@24: T.orderedTrackers[index] = frame Nenue@24: T.namedTrackers[name] = frame Nenue@24: T.indexedTrackers[handler] = frame Nenue@19: print('|cFFFF0088' .. trackerName .. '|r created for |cFF00FFFF' .. handler.displayName .. '|r module') Nenue@19: Nenue@24: T.orderedHandlers[index] = handler Nenue@0: return true Nenue@0: end Nenue@0: Nenue@22: local Event = {} Nenue@22: Event.QUEST_LOG_UPDATE = function() Nenue@22: return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE Nenue@22: end Nenue@22: Event.QUEST_ACCEPTED = function(questLogIndex, questID) Nenue@22: if ( IsQuestTask(questID) ) then Nenue@22: return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED, questID Nenue@22: else Nenue@22: if ( AUTO_QUEST_WATCH == "1" and GetNumQuestWatches() < MAX_WATCHABLE_QUESTS ) then Nenue@22: AddQuestWatch(questLogIndex); Nenue@22: SetSuperTrackedQuestID(questID); Nenue@22: end Nenue@22: return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST Nenue@22: end Nenue@22: end Nenue@23: Nenue@22: Event.QUEST_WATCH_LIST_CHANGED = function(questID, added) Nenue@22: if ( added ) then Nenue@22: if ( not IsQuestTask(questID) ) then Nenue@22: return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added Nenue@22: end Nenue@22: else Nenue@22: return OBJECTIVE_TRACKER_UPDATE_QUEST, questID, added Nenue@22: end Nenue@22: end Nenue@23: Nenue@22: Event.QUEST_POI_UPDATE = function() Nenue@22: QuestPOIUpdateIcons(); Nenue@22: if ( GetCVar("trackQuestSorting") == "proximity" ) then Nenue@22: SortQuestWatches(); Nenue@22: end Nenue@22: return OBJECTIVE_TRACKER_UPDATE_ALL Nenue@22: end Nenue@22: Event.SUPER_TRACKED_QUEST_CHANGED = function() Nenue@22: return OBJECTIVE_TRACKER_UPDATE_QUEST Nenue@22: end Nenue@22: Event.ZONE_CHANGED = function() Nenue@21: Nenue@22: local inMicroDungeon = IsPlayerInMicroDungeon(); Nenue@24: if ( inMicroDungeon ~= T.inMicroDungeon ) then Nenue@19: if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then Nenue@19: SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker Nenue@19: end Nenue@22: --SortQuestWatches(); Nenue@24: T.inMicroDungeon = inMicroDungeon; Nenue@0: end Nenue@0: end Nenue@22: Event.QUEST_AUTOCOMPLETE = function(questId) Nenue@22: AddAutoQuestPopUp(questId, "COMPLETE"); Nenue@22: return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP Nenue@22: end Nenue@22: Event.SCENARIO_CRITERIA_UPDATE = function() Nenue@22: return OBJECTIVE_TRACKER_UPDATE_SCENARIO Nenue@22: end Nenue@22: Event.SCENARIO_UPDATE = function(newStage) Nenue@22: if ( newStage ) then Nenue@22: return OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE Nenue@22: else Nenue@22: return OBJECTIVE_TRACKER_UPDATE_SCENARIO Nenue@22: end Nenue@22: end Nenue@22: Event.TRACKED_ACHIEVEMENT_UPDATE = function() Nenue@22: return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT Nenue@22: end Nenue@22: Event.TRACKED_ACHIEVEMENT_LIST_CHANGED = function(achievementID, added) Nenue@22: if ( added ) then Nenue@22: return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED, achievementID Nenue@22: else Nenue@22: return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT Nenue@22: end Nenue@22: end Nenue@22: Event.ZONE_CHANGED_NEW_AREA = function () Nenue@22: if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then Nenue@22: SetMapToCurrentZone(); -- update the zone to get the right POI numbers for the tracker Nenue@22: end Nenue@22: SortQuestWatches(); Nenue@24: T.currentZoneArea = GetCurrentMapAreaID() Nenue@24: print('Updating zone ID to', T.currentZoneArea, '=', GetZoneText(), GetMinimapZoneText()) Nenue@22: Nenue@22: Nenue@22: return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED Nenue@22: end Nenue@22: Nenue@22: Nenue@22: Event.PLAYER_MONEY = function() Nenue@24: if T.watchMoneyReasons > 0 then Nenue@24: return T.watchMoneyReasons Nenue@22: end Nenue@22: end Nenue@22: Event.CRITERIA_COMPLETE = function() Nenue@22: return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE Nenue@22: end Nenue@22: Event.QUEST_TURN_IN = function(questID, xp, money) Nenue@22: if ( IsQuestTask(questID) ) then Nenue@24: T.Bonus:OnTurnIn(questID, xp, money) Nenue@22: print('updating bonus modules (code', OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, ',', questID, xp, money) Nenue@22: return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, questID, xp, money Nenue@22: else Nenue@22: return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST, questID, xp, money Nenue@22: end Nenue@22: end Nenue@24: T.Event = Event Nenue@0: Nenue@19: --- Done once per ui load Nenue@19: local BlizzHooks = { Nenue@19: ['AddQuestWatch'] = 'AddQuestWatch', Nenue@19: ['RemoveQuestWatch'] = 'RemoveQuestWatch', Nenue@19: ['AbandonQuest'] = 'AbandonQuest', Nenue@19: ['AcknowledgeAutoAcceptQuest'] = 'AcknowledgeAutoAcceptQuest', Nenue@19: ['AddAutoQuestPopUp'] = 'AddAutoQuestPopUp', Nenue@19: ['RemoveAutoQuestPopUp'] = 'RemoveAutoQuestPopUp', Nenue@19: ['AddTrackedAchievement'] = 'AddTrackedAchievement', Nenue@19: ['RemoveTrackedAchievement'] = 'RemoveTrackedAchievement', Nenue@19: ['SetSuperTrackedQuestID'] = 'SetSuperTrackedQuestID' Nenue@19: } Nenue@19: local VeneerData Nenue@22: Nenue@24: T.SetWatchMoney = function(watchMoney, reason) Nenue@22: if watchMoney then Nenue@24: if band(T.watchMoneyReasons, reason) == 0 then Nenue@24: T.watchMoneyReasons = T.watchMoneyReasons + reason; Nenue@22: end Nenue@22: else Nenue@24: if band(T.watchMoneyReasons, reason) > 0 then Nenue@24: T.watchMoneyReasons = T.watchMoneyReasons - reason; Nenue@22: end Nenue@22: end Nenue@22: end Nenue@24: T.animateReasons = 0 Nenue@24: T.SetAnimate = function(animate, reason) Nenue@23: if animate then Nenue@24: if band(T.animateReasons, reason) == 0 then Nenue@24: T.animateReasons = T.animateReasons + reason Nenue@23: end Nenue@23: else Nenue@24: if band(T.animateReasons, reason) > 0 then Nenue@24: T.animateReasons = T.animateReasons - reason Nenue@23: end Nenue@23: end Nenue@23: end Nenue@22: Nenue@23: local Play = function(file) if Devian and Devian.InWorkspace() then PlaySoundFile(file) end end Nenue@23: Nenue@24: function T:OnEvent (event, ...) Nenue@22: local isHandled Nenue@22: print('OnEvent(|cFF00FF00'.. event ..'|r):', ...) Nenue@22: local reason, arg1, arg2, arg3 Nenue@22: if Event[event] then Nenue@22: if type(Event[event]) == 'function' then Nenue@23: Play([[Interface\Addons\SharedMedia_MyMedia\sound\Info.ogg]]) Nenue@22: reason, arg1, arg2, arg3 = Event[event](...) Nenue@22: elseif type(Event[event]) == 'table' then Nenue@23: Play([[Interface\Addons\SharedMedia_MyMedia\sound\Link.ogg]]) Nenue@22: for i, action in ipairs(Event[event]) do Nenue@22: if type(action) == 'function' then Nenue@22: reason, arg1, arg2, arg3 = action(event, ...) Nenue@22: else Nenue@22: reason = action Nenue@22: end Nenue@22: Nenue@22: if reason then Nenue@24: T:Update(reason, arg1, arg2, arg3) Nenue@22: end Nenue@22: end Nenue@22: else Nenue@23: Play([[Interface\Addons\SharedMedia_MyMedia\sound\Heart.ogg]]) Nenue@22: reason = Event[event] Nenue@22: end Nenue@22: else Nenue@23: Play([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]]) Nenue@22: end Nenue@22: if reason then Nenue@24: T:Update(reason, arg1, arg2, arg3) Nenue@22: else Nenue@22: print('no reason value returned') Nenue@23: Play([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]]) Nenue@22: end Nenue@24: Nenue@24: end Nenue@24: Nenue@24: Nenue@24: function T:OnInitialize() Nenue@24: local c = T.Conf.Wrapper Nenue@24: VeneerData = _G.VeneerData Nenue@24: VeneerData.CallLog = VeneerData.CallLog or {} Nenue@24: if not T.isHooked then Nenue@24: T.isHooked = true Nenue@24: for blizzFunc, veneerFunc in pairs(BlizzHooks) do Nenue@24: if T[veneerFunc] then Nenue@24: hooksecurefunc(blizzFunc, T[veneerFunc]) Nenue@24: else Nenue@24: hooksecurefunc(blizzFunc, function(...) Nenue@24: print('|cFFFF0088securehook('..tostring(blizzFunc)..')|r args:', ...) Nenue@24: tinsert(VeneerData.CallLog, {blizzFunc, ...}) Nenue@24: end) Nenue@24: end Nenue@24: end Nenue@24: end Nenue@24: Nenue@24: T.Conf.TasksLog = T.Conf.TasksLog or {} Nenue@24: Nenue@24: ObjectiveTrackerFrame:UnregisterAllEvents() Nenue@24: ObjectiveTrackerFrame:Hide() Nenue@24: Nenue@24: Nenue@24: for id, name in ipairs(T.orderedNames) do Nenue@24: if not T.orderedHandlers[id] then Nenue@24: Handler_Initialize(T.DefaultHandler, name, id) Nenue@24: end Nenue@24: end Nenue@24: self:SetSize(c.Width, 40) Nenue@24: T.InitializeWidgets() Nenue@22: end Nenue@22: Nenue@19: --- Done any time the the minimize button is toggled up Nenue@24: function T:OnEnable() Nenue@24: Nenue@24: print(B.Conf.VeneerObjectiveWrapper.enabled) Nenue@24: if not B.Conf.VeneerObjectiveWrapper.enabled then Nenue@24: return Nenue@19: end Nenue@19: Nenue@22: for event, action in pairs(Event) do Nenue@22: print('|cFFFF0088listen to', event, 'for action|r', tostring(action)) Nenue@22: Wrapper:RegisterEvent(event) Nenue@22: end Nenue@22: Nenue@24: local c = T.Conf.Wrapper Nenue@19: Nenue@24: Scroller:SetScrollChild(Scroll) Nenue@24: Scroller:SetWidth(c.Width) Nenue@24: Scroll:SetWidth(c.Width) Nenue@24: Scroll:ClearAllPoints() Nenue@24: Scroll:SetPoint('TOP', Scroller, 'TOP') Nenue@24: self:SetScript('OnEvent', T.OnEvent) Nenue@23: Nenue@24: Scroller:Show() Nenue@23: Nenue@24: local from, target, to, x, y = Wrapper:GetPoint(1) Nenue@24: print(from, target:GetName(), to, x,y) Nenue@24: Nenue@24: T:Update() Nenue@24: Nenue@24: -- run once to prime the data structure Nenue@24: T.UpdateActionButtons() Nenue@19: end Nenue@19: Nenue@24: function T:OnDisable() Nenue@24: self:UnregisterAllEvents() Nenue@24: Scroller:Hide() Nenue@19: end Nenue@19: