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@16: local mod = 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@21: mod.watchMoneyReasons = 0 Nenue@0: Nenue@19: --- Baseline defaults table; values defined in the files that they pertain to Nenue@16: mod.defaults = {} Nenue@10: Nenue@19: --- Tracker display order Nenue@16: mod.orderedNames = {'Bonus', 'AutoQuest', 'Quest', 'Cheevs'} Nenue@0: Nenue@19: --- ipairs() argument tables Nenue@19: mod.orderedHandlers = setmetatable({}, {__mode = "k"}) Nenue@19: mod.orderedTrackers = setmetatable({}, {__mode = "k"}) Nenue@19: mod.indexedTrackers = setmetatable({}, {__mode = "k"}) Nenue@0: Nenue@19: --- pairs() argument tables Nenue@19: mod.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@19: mod.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@21: mod.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@16: mod.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@16: mod.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@0: } Nenue@16: mod.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@16: mod.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@16: local handler = setmetatable(mod[name] or {}, { Nenue@19: __tostring = Tracker_string, Nenue@19: __call = Tracker_call Nenue@0: }) Nenue@16: if type(mod.orderedHandlers[index]) == 'table' then Nenue@16: return mod.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@16: mod[name] = handler Nenue@16: Nenue@19: local trackerName = 'Veneer'..name..'Tracker' Nenue@19: local handler = mod[name] Nenue@19: local frame = CreateFrame('Frame', trackerName, _G.VeneerObjectiveScroll, 'VeneerTrackerTemplate') Nenue@19: frame.title:SetText(handler.displayName) Nenue@19: mod.SetBlockStyle(frame, 'Tracker', 'Normal') Nenue@19: handler.frame = frame Nenue@19: handler.trackerName = trackerName Nenue@21: handler.lines = {} Nenue@19: mod.orderedTrackers[index] = frame Nenue@19: mod.namedTrackers[name] = frame Nenue@19: mod.indexedTrackers[handler] = frame Nenue@19: print('|cFFFF0088' .. trackerName .. '|r created for |cFF00FFFF' .. handler.displayName .. '|r module') Nenue@19: Nenue@16: mod.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@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@22: Event.QUEST_POI_UPDATE = function() Nenue@21: Nenue@22: QuestPOIUpdateIcons(); Nenue@22: if ( GetCVar("trackQuestSorting") == "proximity" ) then Nenue@22: SortQuestWatches(); Nenue@22: end Nenue@21: Nenue@22: return OBJECTIVE_TRACKER_UPDATE_ALL Nenue@21: 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@22: if ( inMicroDungeon ~= mod.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@22: mod.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@22: mod.currentZoneArea = GetCurrentMapAreaID() Nenue@22: print('Updating zone ID to', mod.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@22: if mod.watchMoneyReasons > 0 then Nenue@22: return mod.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@22: mod.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@22: mod.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@22: mod.SetWatchMoney = function(watchMoney, reason) Nenue@22: if watchMoney then Nenue@22: if band(mod.watchMoneyReasons, reason) == 0 then Nenue@22: mod.watchMoneyReasons = mod.watchMoneyReasons + reason; Nenue@22: end Nenue@22: else Nenue@22: if band(mod.watchMoneyReasons, reason) > 0 then Nenue@22: mod.watchMoneyReasons = mod.watchMoneyReasons - reason; Nenue@22: end Nenue@22: end Nenue@22: end Nenue@22: Nenue@22: Nenue@16: function mod:OnInitialize() Nenue@19: local c = mod.Conf.Wrapper Nenue@19: VeneerData = _G.VeneerData Nenue@19: VeneerData.CallLog = VeneerData.CallLog or {} Nenue@19: if not mod.isHooked then Nenue@19: mod.isHooked = true Nenue@19: for blizzFunc, veneerFunc in pairs(BlizzHooks) do Nenue@19: if mod[veneerFunc] then Nenue@19: hooksecurefunc(blizzFunc, mod[veneerFunc]) Nenue@19: else Nenue@19: hooksecurefunc(blizzFunc, function(...) Nenue@19: print('|cFFFF0088securehook('..tostring(blizzFunc)..')|r args:', ...) Nenue@19: tinsert(VeneerData.CallLog, {blizzFunc, ...}) Nenue@19: end) Nenue@19: end Nenue@19: end Nenue@19: end Nenue@22: Nenue@22: mod.Conf.TasksLog = mod.Conf.TasksLog or {} Nenue@22: Nenue@19: Scroller:SetScrollChild(Scroll) Nenue@19: Scroller:SetWidth(c.Width) Nenue@19: Scroll:SetWidth(c.Width) Nenue@21: Scroll:ClearAllPoints() Nenue@21: Scroll:SetPoint('TOP', Scroller, 'TOP') Nenue@0: ObjectiveTrackerFrame:UnregisterAllEvents() Nenue@0: ObjectiveTrackerFrame:Hide() Nenue@0: end Nenue@19: Nenue@22: function mod: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@22: PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Info.ogg]]) Nenue@22: reason, arg1, arg2, arg3 = Event[event](...) Nenue@22: elseif type(Event[event]) == 'table' then Nenue@22: PlaySoundFile([[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@22: mod:Update(reason, arg1, arg2, arg3) Nenue@22: end Nenue@22: end Nenue@22: else Nenue@22: PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Heart.ogg]]) Nenue@22: reason = Event[event] Nenue@22: end Nenue@22: else Nenue@22: PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]]) Nenue@22: end Nenue@22: if reason then Nenue@22: mod:Update(reason, arg1, arg2, arg3) Nenue@22: else Nenue@22: print('no reason value returned') Nenue@22: PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]]) Nenue@22: end Nenue@22: end Nenue@22: Nenue@19: --- Done any time the the minimize button is toggled up Nenue@19: function mod:OnEnable() Nenue@19: for id, name in ipairs(mod.orderedNames) do Nenue@19: if not mod.orderedHandlers[id] then Nenue@21: Handler_Initialize(mod.DefaultHandler, name, id) Nenue@19: end 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@21: Wrapper:SetScript('OnEvent', mod.OnEvent) Nenue@19: Nenue@19: local c = mod.Conf.Wrapper Nenue@21: --Wrapper:SetPoint(c.AnchorPoint, UIParent, c.AnchorPoint, c.OffsetX, c.OffsetY) Nenue@21: --B.Conf.FramePosition[Wrapper:GetName()] = {c.AnchorPoint, c.AnchorPoint, c.OffsetX, c.OffsetY} Nenue@19: Wrapper:SetWidth(c.Width) Nenue@19: Nenue@19: Nenue@19: mod.InitializeWidgets() Nenue@19: mod:Update() Nenue@19: end Nenue@19: Nenue@19: function mod:OnDisable() Nenue@22: Wrapper:UnregisterAllEvents() Nenue@19: end Nenue@19: Nenue@19: