diff --git a/.vscode/bookmarks.json b/.vscode/bookmarks.json index 873e8c52..19318123 100644 --- a/.vscode/bookmarks.json +++ b/.vscode/bookmarks.json @@ -83,12 +83,12 @@ "path": "$ROOTPATH$\\WorldQuestTracker_Tracker.lua", "bookmarks": [ { - "line": 778, + "line": 783, "column": 41, "label": "" }, { - "line": 825, + "line": 830, "column": 1, "label": "" } @@ -196,6 +196,11 @@ "line": 1065, "column": 2, "label": "" + }, + { + "line": 1242, + "column": 6, + "label": "" } ] } diff --git a/WorldQuestTracker.lua b/WorldQuestTracker.lua index c3a58bb5..9aaa953f 100644 --- a/WorldQuestTracker.lua +++ b/WorldQuestTracker.lua @@ -1234,6 +1234,20 @@ function MicroButtonAlert_OnHide2(self) end +---------------------------------------------------------------------------------------------------------------------------------------------------------------- +local p = CreateFrame("frame") +p:RegisterEvent("TALKINGHEAD_REQUESTED") +p:SetScript("OnEvent", function (self, event, arg1) + if (event == "TALKINGHEAD_REQUESTED") then + local displayInfo, cameraID, vo, duration, lineNumber, numLines, name, text, isNewTalkingHead = C_TalkingHead.GetCurrentLineInfo() + if (WorldQuestTracker.db.profile.talking_heads[vo]) then + C_Timer.After(0.1, TalkingHeadFrame_CloseImmediately) + else + WorldQuestTracker.db.profile.talking_heads[vo] = true + end + end +end) + ---------------------------------------------------------------------------------------------------------------------------------------------------------------- --> faction bounty diff --git a/WorldQuestTracker_GroupFinder.lua b/WorldQuestTracker_GroupFinder.lua index 5781d148..3f3b3636 100644 --- a/WorldQuestTracker_GroupFinder.lua +++ b/WorldQuestTracker_GroupFinder.lua @@ -650,7 +650,7 @@ local GetDistance_Point = DF.GetDistance_Point --leave group big button - local leaveButtonSolo = CreateFrame("button", "$parentLeaveButtonSolo", ff, "BackdropTemplate", "BackdropTemplate") + local leaveButtonSolo = CreateFrame("button", "$parentLeaveButtonSolo", ff, "BackdropTemplate") DF:ApplyStandardBackdrop(leaveButtonSolo) leaveButtonSolo:SetPoint("top", ff, "top", 0, ff.topLevelY) leaveButtonSolo:Hide() diff --git a/WorldQuestTracker_Initialize.lua b/WorldQuestTracker_Initialize.lua index eff30064..6a3ba28d 100644 --- a/WorldQuestTracker_Initialize.lua +++ b/WorldQuestTracker_Initialize.lua @@ -206,6 +206,8 @@ do tracker_scale = 1, tracker_show_time = false, tracker_textsize = 12, + + talking_heads = {}, show_faction_frame = true, diff --git a/WorldQuestTracker_Tracker.lua b/WorldQuestTracker_Tracker.lua index 7df9234c..eb05c241 100644 --- a/WorldQuestTracker_Tracker.lua +++ b/WorldQuestTracker_Tracker.lua @@ -318,6 +318,10 @@ local WorldQuestTrackerHeader = CreateFrame ("frame", "WorldQuestTrackerQuestsHe WorldQuestTrackerHeader.Text:SetText ("World Quest Tracker") local minimizeButton = CreateFrame ("button", "WorldQuestTrackerQuestsHeaderMinimizeButton", WorldQuestTrackerFrame, "BackdropTemplate") local minimizeButtonText = minimizeButton:CreateFontString (nil, "overlay", "GameFontNormal") + +--hide the default minimize button from the blizz template +WorldQuestTrackerHeader.MinimizeButton:Hide() + minimizeButtonText:SetText (L["S_WORLDQUESTS"]) minimizeButtonText:SetPoint ("right", minimizeButton, "left", -3, 1) minimizeButtonText:Hide() @@ -343,6 +347,7 @@ minimizeButton:SetScript ("OnClick", function() minimizeButtonText:SetText ("World Quest Tracker") end end) + minimizeButton:SetNormalTexture ([[Interface\Buttons\UI-Panel-QuestHideButton]]) minimizeButton:GetNormalTexture():SetTexCoord (0, 0.5, 0.5, 1) minimizeButton:SetPushedTexture ([[Interface\Buttons\UI-Panel-QuestHideButton]]) diff --git a/libs/DF/addon.lua b/libs/DF/addon.lua index 2594e55b..9aea39b9 100644 --- a/libs/DF/addon.lua +++ b/libs/DF/addon.lua @@ -31,7 +31,7 @@ end --when the player logout or reloadUI local addonUnload = function(addonFrame, event, ...) --close saved tables - + DF.SavedVars.CloseSavedTable(addonFrame.db) end local addonEvents = { @@ -46,8 +46,8 @@ local addonOnEvent = function(addonFrame, event, ...) func(addonFrame, event, ...) else --might be a registered event from the user - if (addonFrame.event) then - DF:CoreDispatch(addonFrame.__name, addonFrame.event, addonFrame, event, ...) + if (addonFrame[event]) then + DF:CoreDispatch(addonFrame.__name, addonFrame[event], addonFrame, event, ...) end end end @@ -66,6 +66,7 @@ function DF:CreateNewAddOn(addonName, globalSavedVariablesName, savedVarsTemplat newAddon:RegisterEvent("ADDON_LOADED") newAddon:RegisterEvent("PLAYER_LOGIN") + newAddon:RegisterEvent("PLAYER_LOGOUT") newAddon:SetScript("OnEvent", addonOnEvent) return newAddon diff --git a/libs/DF/fw.lua b/libs/DF/fw.lua index 67f3ae6c..7f332674 100644 --- a/libs/DF/fw.lua +++ b/libs/DF/fw.lua @@ -1,6 +1,6 @@ -local dversion = 223 +local dversion = 230 local major, minor = "DetailsFramework-1.0", dversion local DF, oldminor = LibStub:NewLibrary (major, minor) @@ -486,6 +486,7 @@ function DF:GroupIterator (func, ...) for i = 1, GetNumGroupMembers() - 1 do DF:QuickDispatch (func, "party" .. i, ...) end + DF:QuickDispatch (func, "player", ...) else DF:QuickDispatch (func, "player", ...) @@ -3549,7 +3550,7 @@ function DF:GetCharacterRaceList (fullList) local alliedRaceInfo = C_AlliedRaces.GetRaceInfoByID (i) if (alliedRaceInfo and DF.AlliedRaceList [alliedRaceInfo.raceID]) then - tinsert (DF.RaceCache, {Name = alliedRaceInfo.name, FileString = alliedRaceInfo.raceFileString}) + tinsert (DF.RaceCache, {Name = alliedRaceInfo.maleName, FileString = alliedRaceInfo.raceFileString}) end end @@ -4237,3 +4238,5 @@ end _G.setfenv(func, newEnvironment) end + +----------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/libs/DF/panel.lua b/libs/DF/panel.lua index 65713aaa..66691c86 100644 --- a/libs/DF/panel.lua +++ b/libs/DF/panel.lua @@ -5139,7 +5139,7 @@ DF.IconRowFunctions = { newIconFrame.CountdownText:SetPoint (self.options.text_anchor or "center", newIconFrame, self.options.text_rel_anchor or "center", self.options.text_x_offset or 0, self.options.text_y_offset or 0) newIconFrame.CountdownText:Hide() - newIconFrame.StackText = cooldownFrame:CreateFontString (nil, "overlay", "GameFontNormal") + newIconFrame.StackText = newIconFrame:CreateFontString (nil, "overlay", "GameFontNormal") --newIconFrame.StackText:SetPoint ("bottomright") newIconFrame.StackText:SetPoint (self.options.stack_text_anchor or "center", newIconFrame, self.options.stack_text_rel_anchor or "bottomright", self.options.stack_text_x_offset or 0, self.options.stack_text_y_offset or 0) newIconFrame.StackText:Hide() @@ -6080,7 +6080,7 @@ function DF:PassLoadFilters (loadTable, encounterID) canCheckTalents = false for _, specID in ipairs (specsForThisClass) do - if (loadTable.spec [specID]) then + if (loadTable.spec [specID] or loadTable.spec [specID..""]) then --theres a talent for this class canCheckTalents = true break @@ -6092,7 +6092,7 @@ function DF:PassLoadFilters (loadTable, encounterID) local specIndex = DetailsFramework.GetSpecialization() if (specIndex) then local specID = DetailsFramework.GetSpecializationInfo (specIndex) - if (not loadTable.spec [specID]) then + if not specID or (not loadTable.spec [specID] and not loadTable.spec [specID..""]) then return false end else @@ -6114,7 +6114,7 @@ function DF:PassLoadFilters (loadTable, encounterID) local talentsInUse = DF:GetCharacterTalents (false, true) local hasTalent for talentID, _ in pairs (talentsInUse) do - if (loadTable.talent [talentID]) then + if talentID and (loadTable.talent [talentID] or loadTable.talent [talentID .. ""]) then hasTalent = true break end @@ -6129,7 +6129,7 @@ function DF:PassLoadFilters (loadTable, encounterID) local talentsInUse = DF:GetCharacterPvPTalents (false, true) local hasTalent for talentID, _ in pairs (talentsInUse) do - if (loadTable.pvptalent [talentID]) then + if talentID and (loadTable.pvptalent [talentID] or loadTable.pvptalent [talentID .. ""]) then hasTalent = true break end @@ -6171,7 +6171,7 @@ function DF:PassLoadFilters (loadTable, encounterID) local level, affixes, wasEnergized = C_ChallengeMode.GetActiveKeystoneInfo() local hasAffix = false for _, affixID in ipairs (affixes) do - if (loadTable.affix [affixID]) then + if affixID and (loadTable.affix [affixID] or loadTable.affix [affixID .. ""]) then hasAffix = true break end @@ -6285,7 +6285,10 @@ function DF:OpenLoadConditionsPanel (optionsTable, callback, frameOptions) f.OnRadioCheckboxClick = function (self, key, value) --hierarchy: DBKey ["class"] key ["HUNTER"] value TRUE local DBKey = self:GetParent().DBKey - f.OptionsTable [DBKey] [key] = value and true or nil + f.OptionsTable [DBKey] [key and key .. ""] = value and true or nil + if not value then -- cleanup "number" type values + f.OptionsTable [DBKey] [key] = nil + end f.OnRadioStateChanged (self:GetParent(), f.OptionsTable [DBKey]) f.RunCallback() end @@ -6316,7 +6319,7 @@ function DF:OpenLoadConditionsPanel (optionsTable, callback, frameOptions) name = specName, set = f.OnRadioCheckboxClick, param = specID, - get = function() return f.OptionsTable.spec [specID] end, + get = function() return f.OptionsTable.spec [specID] or f.OptionsTable.spec [specID..""] end, texture = specIcon, }) end @@ -6347,7 +6350,7 @@ function DF:OpenLoadConditionsPanel (optionsTable, callback, frameOptions) name = talentTable.Name, set = f.OnRadioCheckboxClick, param = talentTable.ID, - get = function() return f.OptionsTable.talent [talentTable.ID] end, + get = function() return f.OptionsTable.talent [talentTable.ID] or f.OptionsTable.talent [talentTable.ID .. ""] end, texture = talentTable.Texture, }) end @@ -6445,7 +6448,7 @@ function DF:OpenLoadConditionsPanel (optionsTable, callback, frameOptions) name = talentTable.Name, set = f.OnRadioCheckboxClick, param = talentTable.ID, - get = function() return f.OptionsTable.pvptalent [talentTable.ID] end, + get = function() return f.OptionsTable.pvptalent [talentTable.ID] or f.OptionsTable.pvptalent [talentTable.ID .. ""] end, texture = talentTable.Texture, }) end @@ -6543,7 +6546,7 @@ function DF:OpenLoadConditionsPanel (optionsTable, callback, frameOptions) name = groupTable.Name, set = f.OnRadioCheckboxClick, param = groupTable.ID, - get = function() return f.OptionsTable.group [groupTable.ID] end, + get = function() return f.OptionsTable.group [groupTable.ID] or f.OptionsTable.group [groupTable.ID .. ""] end, }) end local groupTypesGroup = DF:CreateRadionGroup (f, groupTypes, name, {width = 200, height = 200, title = "Group Types"}) @@ -6558,7 +6561,7 @@ function DF:OpenLoadConditionsPanel (optionsTable, callback, frameOptions) name = roleTable.Texture .. " " .. roleTable.Name, set = f.OnRadioCheckboxClick, param = roleTable.ID, - get = function() return f.OptionsTable.role [roleTable.ID] end, + get = function() return f.OptionsTable.role [roleTable.ID] or f.OptionsTable.role [roleTable.ID .. ""] end, }) end local roleTypesGroup = DF:CreateRadionGroup (f, roleTypes, name, {width = 200, height = 200, title = "Role Types"}) @@ -6575,7 +6578,7 @@ function DF:OpenLoadConditionsPanel (optionsTable, callback, frameOptions) name = affixName, set = f.OnRadioCheckboxClick, param = i, - get = function() return f.OptionsTable.affix [i] end, + get = function() return f.OptionsTable.affix [i] or f.OptionsTable.affix [i .. ""] end, texture = texture, }) end @@ -6643,7 +6646,7 @@ function DF:OpenLoadConditionsPanel (optionsTable, callback, frameOptions) name = talentTable.Name, set = DetailsFrameworkLoadConditionsPanel.OnRadioCheckboxClick, param = talentTable.ID, - get = function() return DetailsFrameworkLoadConditionsPanel.OptionsTable.talent [talentTable.ID] end, + get = function() return DetailsFrameworkLoadConditionsPanel.OptionsTable.talent [talentTable.ID] or DetailsFrameworkLoadConditionsPanel.OptionsTable.talent [talentTable.ID .. ""] end, texture = talentTable.Texture, }) end @@ -6657,7 +6660,7 @@ function DF:OpenLoadConditionsPanel (optionsTable, callback, frameOptions) name = talentTable.Name, set = DetailsFrameworkLoadConditionsPanel.OnRadioCheckboxClick, param = talentTable.ID, - get = function() return DetailsFrameworkLoadConditionsPanel.OptionsTable.pvptalent [talentTable.ID] end, + get = function() return DetailsFrameworkLoadConditionsPanel.OptionsTable.pvptalent [talentTable.ID] or DetailsFrameworkLoadConditionsPanel.OptionsTable.pvptalent [talentTable.ID .. ""] end, texture = talentTable.Texture, }) end diff --git a/libs/DF/savedvars.lua b/libs/DF/savedvars.lua index b055736b..8aecc490 100644 --- a/libs/DF/savedvars.lua +++ b/libs/DF/savedvars.lua @@ -18,12 +18,19 @@ function DF.SavedVars.CreateNewSavedTable(dbTable, savedTableName) end function DF.SavedVars.GetOrCreateAddonSavedTablesPlayerList(addonFrame) - local addonGlobalSavedTable = _G[addonFrame.savedVarsName] + local addonGlobalSavedTable = _G[addonFrame.__savedVarsName] + + --player list local playerList = addonGlobalSavedTable.__savedVarsByGUID if (not playerList) then addonGlobalSavedTable.__savedVarsByGUID = {} end + --saved variables table + if (not addonGlobalSavedTable.__savedVars) then + addonGlobalSavedTable.__savedVars = {} + end + return addonGlobalSavedTable.__savedVarsByGUID end @@ -51,23 +58,50 @@ function DF.SavedVars.LoadSavedVarsForPlayer(addonFrame) savedTable = addonFrame.db:CreateNewSavedTable(playerSavedTableName) end - addonFrame.db.profile = savedTable - addonFrame.db.currentSavedTableName = playerSavedTableName - + DF.SavedVars.SetSavedTable(dbTable, playerSavedTableName, true, true) return savedTable end +function DF.SavedVars.TableCleanUpRecursive(t, default) + for key, value in pairs(t) do + if (type(value) == "table") then + DF.SavedVars.TableCleanUpRecursive(value, default[key]) + else + if (value == default[key]) then + t[key] = nil + end + end + end +end + +function DF.SavedVars.CloseSavedTable(dbTable) + local currentSavedTable = dbTable:GetSavedTable(dbTable:GetCurrentSavedTableName()) + + local default = dbTable.defaultSavedVars + if (type(currentSavedTable) == "table") then + DF.SavedVars.TableCleanUpRecursive(currentSavedTable, default) + + --save + local addonGlobalSavedTable = _G[dbTable.addonFrame.__savedVarsName] + addonGlobalSavedTable.__savedVars[dbTable:GetCurrentSavedTableName()] = currentSavedTable + end +end --base functions -function DF.SavedVars.SetSavedTable(dbTable, savedTableName, createIfNonExistant) +function DF.SavedVars.SetSavedTable(dbTable, savedTableName, createIfNonExistant, isFromInit) local savedTableToBeApplied = dbTable:GetSavedTable(savedTableName) if (savedTableToBeApplied) then - --callback unload profile table - local currentSavedTable = dbTable:GetSavedTable(dbTable:GetCurrentSavedTableName()) - dbTable:TriggerCallback("OnProfileUnload", currentSavedTable) + if (not isFromInit) then + --callback unload profile table + local currentSavedTable = dbTable:GetSavedTable(dbTable:GetCurrentSavedTableName()) + dbTable:TriggerCallback("OnProfileUnload", currentSavedTable) + DF.SavedVars.CloseSavedTable(dbTable, currentSavedTable) + end dbTable.profile = savedTableToBeApplied + dbTable.currentSavedTableName = savedTableName + dbTable:TriggerCallback("OnProfileLoad", savedTableToBeApplied) else @@ -77,10 +111,11 @@ function DF.SavedVars.SetSavedTable(dbTable, savedTableName, createIfNonExistant --callback unload profile table local currentSavedTable = dbTable:GetSavedTable(dbTable:GetCurrentSavedTableName()) dbTable:TriggerCallback("OnProfileUnload", currentSavedTable) + DF.SavedVars.CloseSavedTable(dbTable, currentSavedTable) dbTable.profile = newSavedTable + dbTable.currentSavedTableName = savedTableName dbTable:TriggerCallback("OnProfileLoad", newSavedTable) - else DF:Msg("profile does not exists", savedTableName) return diff --git a/libs/DF/slider.lua b/libs/DF/slider.lua index c87ad1a7..7b245553 100644 --- a/libs/DF/slider.lua +++ b/libs/DF/slider.lua @@ -856,7 +856,7 @@ local SwitchOnClick = function (self, button, forced_value, value) local success, errorText = xpcall (slider.OnSwitch, geterrorhandler(), slider, slider.FixedValue, value) if (not success) then - error ("Details! Framework: OnSwitch() " .. (button.GetName and button:GetName() or "-NONAME-") .. " error: " .. (errorText or "")) + return end --> trigger hooks diff --git a/libs/DF/spells.lua b/libs/DF/spells.lua index 45c5f529..921ba1e7 100644 --- a/libs/DF/spells.lua +++ b/libs/DF/spells.lua @@ -768,13 +768,16 @@ DF.CrowdControlSpells = { [50259] = "DRUID", --Dazed (from Wild Charge) [209753] = "DRUID", --Cyclone (from pvp talent) [33786] = "DRUID", --Cyclone (from pvp talent - resto druid) + [163505] = "DRUID", --Rake + [127797] = "DRUID", --Ursol's Vortex - [3355] = "HUNTER", --Freezing Trap - [3355] = "HUNTER", --Diamond Ice (from pvp talent) + [3355] = "HUNTER", --Freezing Trap / Diamond Ice (from pvp talent) [19577] = "HUNTER", --Intimidation [190927] = "HUNTER", --Harpoon [162480] = "HUNTER", --Steel Trap [24394] = "HUNTER", --Intimidation + [117405] = "HUNTER", --Binding Shot (trigger) + [117526] = "HUNTER", --Binding Shot (triggered) [119381] = "MONK", --Leg Sweep [115078] = "MONK", --Paralysis @@ -784,6 +787,14 @@ DF.CrowdControlSpells = { [118905] = "SHAMAN", --Static Charge (Capacitor Totem) [51514] = "SHAMAN", --Hex + [210873] = "SHAMAN", --Hex (Compy) + [211004] = "SHAMAN", --Hex (Spider) + [211010] = "SHAMAN", --Hex (Snake) + [211015] = "SHAMAN", --Hex (Cockroach) + [269352] = "SHAMAN", --Hex (Skeletal Hatchling) + [277778] = "SHAMAN", --Hex (Zandalari Tendonripper) + [277784] = "SHAMAN", --Hex (Wicker Mongrel) + [309328] = "SHAMAN", --Hex (Living Honey) [64695] = "SHAMAN", --Earthgrab (talent) [197214] = "SHAMAN", --Sundering (talent) @@ -963,8 +974,6 @@ DF.PotionIDs = { -- [] = true, -- [307165] = true, --Spiritual Anti-Venom - - } DF.FeastIDs = { diff --git a/libs/DF/timebar.lua b/libs/DF/timebar.lua index af1334ba..821f4b0d 100644 --- a/libs/DF/timebar.lua +++ b/libs/DF/timebar.lua @@ -128,6 +128,18 @@ local OnMouseUpFunc = function(statusBar, mouseButton) end --timer functions +function TimeBarMetaFunctions:SetIconSize(width, height) + if (width and not height) then + self.statusBar.icon:SetWidth(width) + + elseif (not width and height) then + self.statusBar.icon:SetHeight(height) + + elseif (width and height) then + self.statusBar.icon:SetSize(width, height) + end +end + function TimeBarMetaFunctions:SetIcon(texture, L, R, T, B) if (texture) then self.statusBar.icon:Show() @@ -136,10 +148,10 @@ function TimeBarMetaFunctions:SetIcon(texture, L, R, T, B) self.statusBar.leftText:ClearAllPoints() self.statusBar.leftText:SetPoint("left", self.statusBar.icon, "right", 2, 0) self.statusBar.icon:SetTexture(texture) + if (L) then self.statusBar.icon:SetTexCoord(L, R, T, B) end - else self.statusBar.icon:Hide() self.statusBar.leftText:ClearAllPoints() @@ -147,6 +159,14 @@ function TimeBarMetaFunctions:SetIcon(texture, L, R, T, B) end end +function TimeBarMetaFunctions:GetIcon() + return self.statusBar.icon +end + +function TimeBarMetaFunctions:SetTexture(texture) + self.statusBar.barTexture:SetTexture(texture) +end + function TimeBarMetaFunctions:SetLeftText(text) self.statusBar.leftText:SetText(text) end @@ -154,28 +174,50 @@ function TimeBarMetaFunctions:SetRightText(text) self.statusBar.rightText:SetText(text) end +function TimeBarMetaFunctions:SetFont(font, size, color, shadow) + if (font) then + DF:SetFontFace(self.statusBar.leftText, font) + end + + if (size) then + DF:SetFontSize(self.statusBar.leftText, size) + end + + if (color) then + DF:SetFontColor(self.statusBar.leftText, color) + end + + if (shadow) then + DF:SetFontOutline(self.statusBar.leftText, shadow) + end +end + function TimeBarMetaFunctions:SetDirection(direction) direction = direction or "right" self.direction = direction end +function TimeBarMetaFunctions:HasTimer() + return self.statusBar.hasTimer +end + function TimeBarMetaFunctions:StopTimer() if (self.statusBar.hasTimer) then + self.statusBar.hasTimer = nil local kill = self:RunHooksForWidget("OnTimerEnd", self.statusBar, self) if (kill) then return end + end - local statusBar = self.statusBar - statusBar:SetScript("OnUpdate", nil) + local statusBar = self.statusBar + statusBar:SetScript("OnUpdate", nil) - statusBar:SetMinMaxValues(0, 100) - statusBar:SetValue(100) - statusBar.rightText:SetText("") + statusBar:SetMinMaxValues(0, 100) + statusBar:SetValue(100) + statusBar.rightText:SetText("") - statusBar.spark:Hide() - statusBar.hasTimer = nil - end + statusBar.spark:Hide() end local OnUpdateFunc = function(self, deltaTime) @@ -211,6 +253,12 @@ local OnUpdateFunc = function(self, deltaTime) end function TimeBarMetaFunctions:SetTimer(currentTime, startTime, endTime) + + if (not currentTime or currentTime == 0) then + self:StopTimer() + return + end + if (startTime and endTime) then if (self.statusBar.hasTimer and currentTime == self.statusBar.timeLeft1) then --it is the same timer called again @@ -240,8 +288,14 @@ function TimeBarMetaFunctions:SetTimer(currentTime, startTime, endTime) self.statusBar.hasTimer = true self.statusBar.direction = self.direction self.statusBar.throttle = 0 + self.statusBar:Show() self.statusBar:SetScript("OnUpdate", OnUpdateFunc) + + local kill = self:RunHooksForWidget("OnTimerStart", self.statusBar, self) + if (kill) then + return + end end