if GetBuildInfo() ~= "7.2.0" then return end local ADDON, Addon = ... local Mod = Addon:NewModule('Persist') local challengeMapID local function LoadPersist() local function IsInCompletedInstance() return select(10, C_Scenario.GetInfo()) == LE_SCENARIO_TYPE_CHALLENGE_MODE and C_ChallengeMode.GetCompletionInfo() ~= 0 and select(3, C_Scenario.GetInfo()) == 0 and challengeMapID end ScenarioTimer_OnUpdate_Old = ScenarioTimer_OnUpdate function ScenarioTimer_OnUpdate(self, elapsed) if self.block.timerID ~= -1 then self.timeSinceBase = self.timeSinceBase + elapsed; end self.updateFunc(self.block, floor(self.baseTime + self.timeSinceBase)); end ScenarioTimerFrame:SetScript("OnUpdate", ScenarioTimer_OnUpdate) ScenarioTimer_Start_Old = ScenarioTimer_Start function ScenarioTimer_Start(block, updateFunc) if block.timerID == -1 then local mapID, level, timeElapsed, onTime, keystoneUpgradeLevels = C_ChallengeMode.GetCompletionInfo() ScenarioTimerFrame.baseTime = floor(timeElapsed/1000); else local _, elapsedTime = GetWorldElapsedTime(block.timerID); ScenarioTimerFrame.baseTime = elapsedTime; challengeMapID = C_ChallengeMode.GetActiveChallengeMapID() end ScenarioTimerFrame.timeSinceBase = 0; ScenarioTimerFrame.block = block; ScenarioTimerFrame.updateFunc = updateFunc; ScenarioTimerFrame:Show(); end ScenarioTimer_Stop_Old = ScenarioTimer_Stop function ScenarioTimer_Stop(...) if IsInCompletedInstance() then local mapID, level, timeElapsed, onTime, keystoneUpgradeLevels = C_ChallengeMode.GetCompletionInfo() local name, _, timeLimit = C_ChallengeMode.GetMapInfo(challengeMapID) Scenario_ChallengeMode_ShowBlock(-1, floor(timeElapsed/1000), timeLimit) else ScenarioTimer_Stop_Old(...) end end SCENARIO_CONTENT_TRACKER_MODULE_StaticReanchor_Old = SCENARIO_CONTENT_TRACKER_MODULE.StaticReanchor function SCENARIO_CONTENT_TRACKER_MODULE:StaticReanchor() local inCompletedInstance = IsInCompletedInstance() local scenarioName, currentStage, numStages, flags, _, _, completed, xp, money = C_Scenario.GetInfo(); local rewardsFrame = ObjectiveTrackerScenarioRewardsFrame; if ( numStages == 0 and not inCompletedInstance ) then ScenarioBlocksFrame_Hide(); return; end if ( ScenarioBlocksFrame:IsShown() ) then ObjectiveTracker_AddBlock(SCENARIO_TRACKER_MODULE.BlocksFrame); end end SCENARIO_CONTENT_TRACKER_MODULE_Update_Old = SCENARIO_CONTENT_TRACKER_MODULE.Update function SCENARIO_CONTENT_TRACKER_MODULE:Update() local inCompletedInstance = IsInCompletedInstance() local scenarioName, currentStage, numStages, flags, _, _, _, xp, money, scenarioType = C_Scenario.GetInfo(); local rewardsFrame = ObjectiveTrackerScenarioRewardsFrame; if ( numStages == 0 and not inCompletedInstance ) then ScenarioBlocksFrame_Hide(); return; end local BlocksFrame = SCENARIO_TRACKER_MODULE.BlocksFrame; local objectiveBlock = SCENARIO_TRACKER_MODULE:GetBlock(); local stageBlock = ScenarioStageBlock; -- if sliding, ignore updates unless the stage changed if ( BlocksFrame.slidingAction ) then if ( BlocksFrame.currentStage == currentStage ) then ObjectiveTracker_AddBlock(BlocksFrame); BlocksFrame:Show(); return; else ObjectiveTracker_EndSlideBlock(BlocksFrame); end end BlocksFrame.maxHeight = SCENARIO_CONTENT_TRACKER_MODULE.BlocksFrame.maxHeight; BlocksFrame.currentBlock = nil; BlocksFrame.contentsHeight = 0; SCENARIO_TRACKER_MODULE.contentsHeight = 0; local stageName, stageDescription, numCriteria, _, _, _, numSpells, spellInfo, weightedProgress = C_Scenario.GetStepInfo(); local inChallengeMode = (scenarioType == LE_SCENARIO_TYPE_CHALLENGE_MODE); local inProvingGrounds = (scenarioType == LE_SCENARIO_TYPE_PROVING_GROUNDS); local dungeonDisplay = (scenarioType == LE_SCENARIO_TYPE_USE_DUNGEON_DISPLAY); local scenariocompleted = currentStage > numStages; if ( scenariocompleted ) then ObjectiveTracker_AddBlock(stageBlock); ScenarioBlocksFrame_SetupStageBlock(scenariocompleted); stageBlock:Show(); elseif ( inChallengeMode or inCompletedInstance ) then if ( ScenarioChallengeModeBlock.timerID or inCompletedInstance ) then ObjectiveTracker_AddBlock(ScenarioChallengeModeBlock); end stageBlock:Hide(); elseif ( ScenarioProvingGroundsBlock.timerID ) then ObjectiveTracker_AddBlock(ScenarioProvingGroundsBlock); stageBlock:Hide(); else -- add the stage block ObjectiveTracker_AddBlock(stageBlock); stageBlock:Show(); -- update if stage changed if ( BlocksFrame.currentStage ~= currentStage or BlocksFrame.scenarioName ~= scenarioName ) then SCENARIO_TRACKER_MODULE:FreeUnusedLines(objectiveBlock); if ( bit.band(flags, SCENARIO_FLAG_SUPRESS_STAGE_TEXT) == SCENARIO_FLAG_SUPRESS_STAGE_TEXT ) then stageBlock.Stage:SetText(stageName); stageBlock.Stage:SetSize( 172, 36 ); stageBlock.Stage:SetPoint("TOPLEFT", 15, -18); stageBlock.FinalBG:Hide(); stageBlock.Name:SetText(""); else if ( currentStage == numStages ) then stageBlock.Stage:SetText(SCENARIO_STAGE_FINAL); stageBlock.FinalBG:Show(); else stageBlock.Stage:SetFormattedText(SCENARIO_STAGE, currentStage); stageBlock.FinalBG:Hide(); end stageBlock.Stage:SetSize( 172, 18 ); stageBlock.Name:SetText(stageName); if ( stageBlock.Name:GetStringWidth() > stageBlock.Name:GetWrappedWidth() ) then stageBlock.Stage:SetPoint("TOPLEFT", 15, -10); else stageBlock.Stage:SetPoint("TOPLEFT", 15, -18); end end if (not stageBlock.appliedAlready) then -- Ugly hack to get around :IsTruncated failing if used during load C_Timer.After(1, function() stageBlock.Stage:ApplyFontObjects(); end); stageBlock.appliedAlready = true; end ScenarioStage_CustomizeBlock(stageBlock, scenarioType); end end BlocksFrame.scenarioName = scenarioName; BlocksFrame.currentStage = currentStage; if ( not ScenarioProvingGroundsBlock.timerID and not scenariocompleted ) then if (weightedProgress) then self:UpdateWeightedProgressCriteria(stageDescription, stageBlock, objectiveBlock, BlocksFrame); else self:UpdateCriteria(numCriteria, objectiveBlock); self:AddSpells(objectiveBlock, spellInfo); -- add the objective block objectiveBlock:SetHeight(objectiveBlock.height); if ( ObjectiveTracker_AddBlock(objectiveBlock) ) then if ( not BlocksFrame.slidingAction ) then objectiveBlock:Show(); end else objectiveBlock:Hide(); stageBlock:Hide(); end end end ScenarioSpellButtons_UpdateCooldowns(); -- add the scenario block if ( BlocksFrame.currentBlock ) then BlocksFrame.height = BlocksFrame.contentsHeight + 1; BlocksFrame:SetHeight(BlocksFrame.contentsHeight + 1); ObjectiveTracker_AddBlock(BlocksFrame); BlocksFrame:Show(); if ( OBJECTIVE_TRACKER_UPDATE_REASON == OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE and not inChallengeMode ) then if ( ObjectiveTrackerFrame:IsVisible() ) then if ( currentStage == 1 ) then ScenarioBlocksFrame_SlideIn(); else ScenarioBlocksFrame_SetupStageBlock(scenariocompleted); if ( not scenariocompleted ) then ScenarioBlocksFrame_SlideOut(); end end end LevelUpDisplay_PlayScenario(); -- play sound if not the first stage if ( currentStage > 1 and currentStage <= numStages ) then PlaySound(31754); end elseif ( OBJECTIVE_TRACKER_UPDATE_REASON == OBJECTIVE_TRACKER_UPDATE_SCENARIO_SPELLS ) then ScenarioSpells_SlideIn(objectiveBlock); end -- header if ( inChallengeMode ) then SCENARIO_CONTENT_TRACKER_MODULE.Header.Text:SetText(scenarioName); elseif ( inProvingGrounds or ScenarioProvingGroundsBlock.timerID ) then SCENARIO_CONTENT_TRACKER_MODULE.Header.Text:SetText(TRACKER_HEADER_PROVINGGROUNDS); elseif( dungeonDisplay ) then SCENARIO_CONTENT_TRACKER_MODULE.Header.Text:SetText(TRACKER_HEADER_DUNGEON); else SCENARIO_CONTENT_TRACKER_MODULE.Header.Text:SetText(TRACKER_HEADER_SCENARIO); end else ScenarioBlocksFrame_Hide(); end end SCENARIO_CONTENT_TRACKER_MODULE_UpdateCriteria_Old = SCENARIO_CONTENT_TRACKER_MODULE.UpdateCriteria function SCENARIO_CONTENT_TRACKER_MODULE:UpdateCriteria(numCriteria, objectiveBlock) if IsInCompletedInstance() then Addon.Splits.UpdateSplits(self, numCriteria, objectiveBlock, true) else SCENARIO_CONTENT_TRACKER_MODULE_UpdateCriteria_Old(self, numCriteria, objectiveBlock) end end end local function LoadExclusive() local function IsInActiveInstance() return select(10, C_Scenario.GetInfo()) == LE_SCENARIO_TYPE_CHALLENGE_MODE and select(3, C_Scenario.GetInfo()) ~= 0 end ObjectiveTracker_Update_Old = ObjectiveTracker_Update function ObjectiveTracker_Update(...) if IsInActiveInstance() then local tracker = ObjectiveTrackerFrame local modules_old = tracker.MODULES local modules_ui_old = tracker.MODULES_UI_ORDER tracker.MODULES = { SCENARIO_CONTENT_TRACKER_MODULE } tracker.MODULES_UI_ORDER = { SCENARIO_CONTENT_TRACKER_MODULE } for i = 1, #modules_old do local module = modules_old[i] if module ~= SCENARIO_CONTENT_TRACKER_MODULE then module:BeginLayout() module:EndLayout() module.Header:Hide() if module.Header.animating then module.Header.animating = nil module.Header.HeaderOpenAnim:Stop() end end end ObjectiveTracker_Update_Old(...) tracker.MODULES = modules_old tracker.MODULES_UI_ORDER = modules_ui_old else ObjectiveTracker_Update_Old(...) end end ObjectiveTracker_ReorderModules_Old = ObjectiveTracker_ReorderModules function ObjectiveTracker_ReorderModules() if IsInActiveInstance() then local modules = ObjectiveTrackerFrame.MODULES; local modulesUIOrder = ObjectiveTrackerFrame.MODULES_UI_ORDER; else ObjectiveTracker_ReorderModules_Old() end end end function Mod:CHALLENGE_MODE_COMPLETED() ScenarioTimer_CheckTimers(GetWorldElapsedTimers()) ObjectiveTracker_Update() end function Mod:Startup() if Addon.Config.persistTracker and LoadPersist then LoadPersist() LoadPersist = nil self:RegisterEvent("CHALLENGE_MODE_COMPLETED") end if Addon.Config.exclusiveTracker and LoadExclusive then LoadExclusive() LoadExclusive = nil self:RegisterEvent("CHALLENGE_MODE_COMPLETED") end challengeMapID = C_ChallengeMode.GetActiveChallengeMapID() end function Mod:AfterStartup() if Addon.Config.persistTracker or Addon.Config.exclusiveTracker then ObjectiveTracker_Update() end end