Compare with Previous | Blame | View Log
QUESTGURU_VERSION = GetAddOnMetadata("QuestGuru", "Version"); QuestGuru_Settings = {}; QuestGuru_Items = {}; QGC_Cache = {}; QGC_Active = {}; local QuestGuru_RealmName, QuestGuru_PlayerFaction; do local QuestGuru_Frame = CreateFrame("Frame", "QuestGuru_Frame", UIParent); QuestGuru_Frame:SetScript("OnEvent", function (self, event, arg1, arg2) QuestGuru_OnEvent(self, event, arg1, arg2); end); QuestGuru_Frame:RegisterEvent("QUEST_COMPLETE"); QuestGuru_Frame:RegisterEvent("QUEST_LOG_UPDATE"); QuestGuru_Frame:RegisterEvent("QUEST_PROGRESS"); QuestGuru_Frame:RegisterEvent("UI_INFO_MESSAGE"); QuestGuru_Frame:RegisterEvent("VARIABLES_LOADED"); QuestGuru_Frame:RegisterEvent("GOSSIP_SHOW"); QuestGuru_Frame:RegisterEvent("QUEST_DETAIL"); QuestGuru_Frame:RegisterEvent("QUEST_GREETING"); QuestGuru_Frame:RegisterEvent("QUEST_PROGRESS"); tinsert(UISpecialFrames, "QuestLogFrame"); QuestLogFrame:SetMovable(true) QuestLogFrame:EnableMouse(true) QuestLogFrame:RegisterForDrag("LeftButton") QuestLogFrame:SetScript("OnDragStart", QuestLogFrame.StartMoving) QuestLogFrame:SetScript("OnDragStop", QuestLogFrame.StopMovingOrSizing) end function QuestGuru_OnEvent(self, event, arg1, arg2) if (event == "UI_INFO_MESSAGE") then QuestGuru_UIInfoMessage(arg1); elseif (event == "VARIABLES_LOADED") then QuestLogTitleText:SetText(QuestLogTitleText:GetText().." - QuestGuru v"..QUESTGURU_VERSION); QuestGuru_LoadVariables(); QuestGuru_HistoryShowButton:Hide(); if IsAddOnLoaded("QuestCompletist") then QuestGuru_HistoryShowButton:Show(); end elseif (event=="QUEST_COMPLETE") then if (QuestGuru_Settings.AutoComplete and (GetNumQuestChoices() == 0)) then QuestRewardCompleteButton_OnClick(); end elseif (event=="QUEST_PROGRESS") then QuestGuru_QuestProgressShow(); if (QuestGuru_Settings.AutoComplete and IsQuestCompletable()) then CompleteQuest(); end elseif (event=="QUEST_LOG_UPDATE") then wipe(QGC_Active); local numEntries, numQuests = GetNumQuestLogEntries(); for i=1, numEntries do local qLink = GetQuestLink(i); if (qLink) then local qi, qj, questNum = string.find(qLink, (":(%d+):")); if (questNum) then QGC_Active[questNum]="true"; end end end elseif (event=="GOSSIP_SHOW") then QuestGuru_GossipShow(); elseif (event=="QUEST_GREETING") then QuestGuru_QuestFrameGreetingPanel_OnShow(); elseif (event=="QUEST_DETAIL") then QuestGuru_QuestDetailShow(); end end function QuestGuru_ShowHistory() -- Bring up any history addon that is installed but doesn't have it's own button if IsAddOnLoaded("QuestCompletist") then qcQuestCompletistUI:Show(); end end function QuestGuru_TitleButtonCheckBox_OnClick(self, button, down) local index = self:GetParent():GetID(); local questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(index); if (self:GetChecked()) then if (isHeader) then QuestGuru_AddQuestWatchHeader(questLogTitleText); else if (not AddQuestWatch(index)) then self:SetChecked(0); end end else if (isHeader) then QuestGuru_RemoveQuestWatchHeader(questLogTitleText); else RemoveQuestWatch(index); end end WatchFrame_Update(); QuestLog_Update(); end function QuestGuru_AddQuestWatchHeader(questHeader) local numEntries, numQuests = GetNumQuestLogEntries(); local inHeader = false; for questIndex=1, numEntries do local questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(questIndex); if (isHeader) then if (questLogTitleText == questHeader) then inHeader = true; else inHeader = false; end end if (inHeader and (not isHeader)) then AddQuestWatch(questIndex); end end end function IsHeaderWatched(questHeader) local numEntries, numQuests = GetNumQuestLogEntries(); local inHeader = false; local headerWatched = true; for questIndex=1, numEntries do local questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(questIndex); if (isHeader) then if (questLogTitleText == questHeader) then inHeader = true; else inHeader = false; end end if (inHeader and (not isHeader)) then headerWatched = (headerWatched and IsQuestWatched(questIndex)); end end return headerWatched; end function QuestGuru_RemoveQuestWatchHeader(questHeader) local numEntries, numQuests = GetNumQuestLogEntries(); local inHeader = false; for questIndex=1, numEntries do local questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(questIndex); if (isHeader) then if (questLogTitleText == questHeader) then inHeader = true; else inHeader = false; end end if (inHeader and (not isHeader)) then RemoveQuestWatch(questIndex); end end end local prevParent; local function QuestGuru_QuestLog_HighlightQuest(questLogTitle) if ( prevParent and prevParent ~= questLogTitle ) then -- set prev quest's colors back to normal prevParent.level:SetTextColor(prevParent.r, prevParent.g, prevParent.b); end if ( questLogTitle ) then -- highlight the quest's colors questLogTitle.level:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); end prevParent = questLogTitle; end function QuestGuru_SetSelection(questIndex) if ( questIndex == 0 ) then return; end -- find and highlight the selected quest local buttons = QuestLogScrollFrame.buttons; local numButtons = #buttons; local min = 1; local max = #buttons; local mid; local titleButton, id; while ( min <= max ) do mid = bit.rshift(min + max, 1); titleButton = buttons[mid]; id = titleButton:GetID(); if ( id == questIndex ) then QuestGuru_QuestLog_HighlightQuest(titleButton); break; end if ( id > questIndex ) then max = mid - 1; else min = mid + 1; end end end hooksecurefunc("QuestLog_SetSelection", QuestGuru_SetSelection); --local QG_QuestLogUpdate = QuestLog_Update; function QG_QuestLog_Update() -- QG_QuestLogUpdate(); local buttons = QuestLogScrollFrame.buttons; local numButtons = #buttons; local scrollOffset = HybridScrollFrame_GetOffset(QuestLogScrollFrame); local questLogSelection = GetQuestLogSelection(); local questIndex, questLogTitle, questTitleTag, questNumGroupMates, questNormalText, questCheck; local title, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily; for i=1, numButtons do questLogTitle = buttons[i]; questIndex = questLogTitle:GetID(); title, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(questIndex); questNumGroupMates = questLogTitle.groupMates; questNumGroupMates:SetPoint("LEFT", 6, 0); if (questLogTitle.level == nil) then questLogTitle.level = questLogTitle:CreateFontString(questLogTitle:GetName().."Level", "BACKGROUND", "GameFontNormalSmall"); questLogTitle.tag:SetFontObject("GameFontNormalSmall"); questLogTitle.level:SetPoint("LEFT", 28, 0); questLogTitle.level:SetWidth(32); questLogTitle.level:SetJustifyH("CENTER"); questLogTitle.level.parentKey = "level"; questLogTitle:HookScript("OnEnter", function(self) self.level:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); end); questLogTitle:HookScript("OnLeave", function(self) if ( self:GetID() ~= QuestLogFrame.selectedIndex ) then self.level:SetTextColor(self.r, self.g, self.b); end end); end if (questLogTitle.checkBox == nil) then questLogTitle.checkBox = CreateFrame("CheckButton", questLogTitle:GetName().."CheckBox", questLogTitle, "OptionsCheckButtonTemplate"); questLogTitle.checkBox:SetHeight(16); questLogTitle.checkBox:SetWidth(16); questLogTitle.checkBox:SetPoint("LEFT", 16, 0); questLogTitle.checkBox:SetHitRectInsets(0, 0, 0, 0); questLogTitle.checkBox:SetScript("OnClick", QuestGuru_TitleButtonCheckBox_OnClick); end questLogTitle.check:Hide(); questLevel = questLogTitle.level; if (isHeader) then questLevel:SetText(""); questLogTitle.normalText:SetPoint("LEFT", 32, 0); if (IsHeaderWatched(title)) then questLogTitle.checkBox:SetChecked(1); else questLogTitle.checkBox:SetChecked(0); end else local strLvl = level if (isDaily) then strLvl = strLvl.."Y"; end if (questTag ~= nil) then if ((questTag == "Group") and (suggestedGroup > 0)) then strLvl = strLvl.."G"..suggestedGroup; elseif (questTag == "Dungeon") then strLvl = strLvl.."D"; else strLvl = strLvl.."+" end else if (suggestedGroup > 0) then strLvl = strLvl.."G"..suggestedGroup; end end if (QuestGuru_Settings.ShowLevels == nil) then QuestGuru_Settings.ShowLevels = {}; end if (QuestGuru_Settings.ShowLevels.QuestLog) then questLevel:Show(); textLeft = 52; else questLevel:Hide(); textLeft = 32; end questLevel:SetText(strLvl); questLogTitle.normalText:SetPoint("LEFT", textLeft, 0); local color = GetQuestDifficultyColor(level); questLevel:SetTextColor(color.r, color.g, color.b); if ( questLogSelection == questIndex ) then QuestGuru_QuestLog_HighlightQuest(questLogTitle); end if (IsQuestWatched(questIndex)) then questLogTitle.checkBox:SetChecked(1); else questLogTitle.checkBox:SetChecked(0); end end QuestLogTitleButton_Resize(questLogTitle); end end hooksecurefunc("QuestLog_Update", QG_QuestLog_Update); QuestLogScrollFrame.update = function () QuestLog_Update(); end; function QuestGuru_ShowObjectives(template, parentFrame, acceptButton, material) local i, lastObjective; local numObjectives = GetNumQuestLeaderBoards(); for i=1, MAX_OBJECTIVES do _G["QuestGuru_QuestLogObjectiveItem"..i]:Hide(); _G["QuestGuru_QuestLogObjectiveItem"..i].timerEnabled = false; end if (QuestGuru_Settings.ShowObjItemIcons) then local currObjItem = 0; for i=1, numObjectives, 1 do local text, type, finished = GetQuestLogLeaderBoard(i); local count; if (type == "item") then local questObj = _G["QuestInfoObjective"..i]; if ( not text or strlen(text) == 0 ) then text = type; end if ( finished ) then questObj:SetTextColor(0.2, 0.2, 0.2); text = text.." ("..COMPLETE..")"; else questObj:SetTextColor(0, 0, 0); end questObj:SetText(text); questObj:Show(); questObj:SetAlpha(0); lastObjective = questObj; currObjItem = currObjItem + 1; local questItem = _G["QuestGuru_QuestLogObjectiveItem"..currObjItem]; questItem.type = "required"; local x, y, name, numItems, numNeeded = string.find(text, QG_ITEM_REQ_STR); local iiName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, texture = GetItemInfo(name); if ((not itemLink) and QuestGuru_Items[QuestGuru_RealmName][name]) then iiName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, texture = GetItemInfo(QuestGuru_Items[QuestGuru_RealmName][name]); end if (not itemLink) then texture = "Interface\\Icons\\INV_Misc_QuestionMark"; count = 0; SetItemButtonTextureVertexColor(questItem, 0.4, 0.4, 0.4); QuestGuru_CommSendPGMessage("0301", name); else if (texture == nil) then GameTooltip:SetHyperlink(itemLink); GameTooltip:Show(); GameTooltip:Hide(); questItem.timerEnabled = true; end count = GetItemCount(itemLink); SetItemButtonTextureVertexColor(questItem, 0.8, 0.8, 0.8); end questItem:SetID(currObjItem) -- For the tooltip questItem.rewardType = "item" questItem.link = itemLink; _G["QuestGuru_QuestLogObjectiveItem"..currObjItem.."Name"]:SetText(name); _G["QuestGuru_QuestLogObjectiveItem"..currObjItem.."Count"]:SetText(count.." /"..numNeeded); SetItemButtonTexture(questItem, texture); SetItemButtonNameFrameVertexColor(questItem, 1, 1, 1); if ( currObjItem > 1 ) then if ( mod(currObjItem ,2) == 1 ) then questItem:SetPoint("TOPLEFT", "QuestGuru_QuestLogObjectiveItem"..(currObjItem - 2), "BOTTOMLEFT", 0, -2); lastObjective = questItem; else questItem:SetPoint("TOPLEFT", "QuestGuru_QuestLogObjectiveItem"..(currObjItem - 1), "TOPRIGHT", 1, 0); lastObjective = _G["QuestGuru_QuestLogObjectiveItem"..(currObjItem)-1]; end else if (i > 1) then questItem:SetPoint("TOPLEFT", "QuestInfoObjective"..(i - 1), "BOTTOMLEFT", 0, -5); else questItem:SetPoint("TOPLEFT"); end lastObjective = questItem; end questItem:Show(); end end if ( lastObjective ) then QuestInfoObjectivesFrame:SetHeight(QuestInfoObjectivesFrame:GetTop() - lastObjective:GetTop() + lastObjective:GetHeight()); QuestInfoDescriptionHeader:SetPoint("TOPLEFT", QuestInfoObjectivesFrame, "BOTTOMLEFT"); end end end hooksecurefunc("QuestInfo_Display", QuestGuru_ShowObjectives); function QuestGuru_UIInfoMessage(arg1) local questID=0; local sound, announceText; local numEntries, numQuests = GetNumQuestLogEntries(); local i, ii, jj, itemName, numDone, numNeeded; local questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily; if (arg1 == nil) then return; end for questID=1, numEntries, 1 do questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(questID); local numObjectives = GetNumQuestLeaderBoards(questID); local currQuest = false; local questComplete = true; sound = nil; announceText = nil; if (numObjectives ~= nil) then for i=1, numObjectives, 1 do local text, type, finished = GetQuestLogLeaderBoard(i,questID); local qi, qj, qitemName, qnumDone, qnumNeeded = string.find(text, QG_ITEM_REQ_STR); if ((type == "item") or (type == "monster") or (type == "object")) then if (type == "object") then type = "item"; end ii, jj, itemName, numDone, numNeeded = string.find(arg1, QG_ITEM_REQ_STR); if ((itemName == qitemName) and (numNeeded == qnumNeeded)) then if (QuestGuru_Settings.Sounds.Progress.Enabled) then sound = QuestGuru_Settings.Sounds.Progress.Sound; end if (QuestGuru_Settings.Announce.item.Enabled and (type == "item")) then announceText = QuestGuru_Settings.Announce.item.Text; end if (QuestGuru_Settings.Announce.monster.Enabled and (type == "monster")) then announceText = QuestGuru_Settings.Announce.monster.Text; end if (numDone == numNeeded) then if (QuestGuru_Settings.Sounds.ObjComplete.Enabled) then sound = QuestGuru_Settings.Sounds.ObjComplete.Sound; end if (announceText) then announceText = announceText.." ($complete)"; end finished = true; end currQuest = true; end elseif (type == "event") then itemName = text; numDone=1; numNeeded=1; if (arg1 == text.." ("..COMPLETE..")") then if (QuestGuru_Settings.Sounds.ObjComplete.Enabled) then sound = QuestGuru_Settings.Sounds.ObjComplete.Sound; end if (QuestGuru_Settings.Announce.event.Enabled) then announceText = QuestGuru_Settings.Announce.event.Text; end currQuest = true; finished = true; end end if (not finished) then questComplete = false; end end end if (currQuest) then if (questComplete) then if (QuestGuru_Settings.Sounds.QuestComplete.Enabled) then sound = QuestGuru_Settings.Sounds.QuestComplete.Sound; end if (QuestGuru_Settings.Announce.Quest.Enabled) then announceText = QuestGuru_Settings.Announce.Quest.Text; end UIErrorsFrame:AddMessage(QG_QUEST_COMPLETE, 1, 1, 0, 1, 5); end QuestGuru_PlayExtraSound(sound); QuestGuru_DoAnnounce(announceText, numDone, numNeeded, itemName, questLogTitleText, arg1, questID); QuestGuru_CommAddTimer(1, 1, QuestGuru_SendQuestStatus, questID, false); end end end function QuestGuru_PlayExtraSound(sound) if (sound == nil) then return; end if (QuestGuru_Settings.Sounds.Enabled) then if ((string.sub(sound, -4) == ".wav") or (string.sub(sound, -4) == ".mp3")) then PlaySoundFile(sound); else PlaySound(sound); end end end function QuestGuru_QuestProgressShow() local questTitle = GetTitleText(); QuestGuru_UpdateProgressFrame(questTitle, GetGossipActiveQuests()); local i; for i=1, GetNumQuestItems() do local name, texture, numItems, quality, isUsable = GetQuestItemInfo("required", i); local link = GetQuestItemLink("required", i); if (name and link) then QuestGuru_Items[QuestGuru_RealmName][name] = link; _G["QuestProgressItem"..i].link = link; _G["QuestProgressItem"..i]:SetScript("OnEnter", function (self) GameTooltip:SetOwner(self, "ANCHOR_RIGHT"); GameTooltip:SetHyperlink(self.link); end); end end end function QuestGuru_UpdateProgressFrame(questTitle, ...) local i; for i=1, select("#", ...), 3 do if (select(i, ...) == questTitle) then QuestProgressTitleText:SetText("["..select(i+1, ...).."] "..questTitle); end end end function QuestGuru_LoadVariables() QuestGuru_Player = UnitName("player"); QuestGuru_PlayerFaction = UnitFactionGroup("player"); QuestGuru_RealmName = GetRealmName(); if (QuestGuru_Items == nil) then QuestGuru_Items = {}; end if (QuestGuru_Items[QuestGuru_RealmName] == nil) then QuestGuru_Items[QuestGuru_RealmName] = {}; end if (QuestGuru_Settings == nil) then QuestGuru_Settings = {}; end QuestGuru_QuestAnnounceLoadSettings(); QuestGuru_OptionsSoundsLoadSettings(); if (QuestGuru_Settings.AutoComplete ~= true) then QuestGuru_Settings.AutoComplete = false; end QuestGuru_OptionsFrameAutoCompleteToggle:SetChecked(QuestGuru_Settings.AutoComplete); if (QuestGuru_Settings.ShowObjItemIcons ~= true) then QuestGuru_Settings.ShowObjItemIcons = false; end QuestGuru_OptionsFrameShowObjItemIconsToggle:SetChecked(QuestGuru_Settings.ShowObjItemIcons); if (QuestGuru_Settings.DisableComm ~= true) then QuestGuru_Settings.DisableComm = false; end QuestGuru_OptionsFrameDisableCommToggle:SetChecked(QuestGuru_Settings.DisableComm); if (QuestGuru_Settings.HeaderQuests ~= false) then QuestGuru_Settings.HeaderQuests = true; end QuestGuru_OptionsFrameShowHeaderQuestsToggle:SetChecked(QuestGuru_Settings.HeaderQuests); if (QuestGuru_Settings.ShowLevels == nil) then QuestGuru_Settings.ShowLevels = {}; end if (QuestGuru_Settings.ShowLevels.QuestLog ~= false) then QuestGuru_Settings.ShowLevels.QuestLog = true; end QuestGuru_OptionsFrameShowLevelsQuestLogToggle:SetChecked(QuestGuru_Settings.ShowLevels.QuestLog); end function QuestGuru_Echo(msg, always) local info = ChatTypeInfo["SYSTEM"]; if (always or ((QuestGuru_Settings) and (QuestGuru_Settings.DebugLevel) and (QuestGuru_Settings.DebugLevel > 0))) then DEFAULT_CHAT_FRAME:AddMessage(msg, info.r, info.g, info.b, info.id); end end function QuestGuru_QuestFrameGreetingPanel_OnShow() local numActiveQuests = GetNumActiveQuests(); for i=1, numActiveQuests, 1 do local questTitleButton = _G["QuestTitleButton"..i]; local questTitleButtonIcon = _G[questTitleButton:GetName() .. "QuestIcon"]; local level = GetActiveLevel(i); if (level == -1) then level = "*"; end local title = GetActiveTitle(i); if ( IsActiveQuestTrivial(i) ) then questTitleButton:SetFormattedText(TRIVIAL_QUEST_DISPLAY, "["..level.."] "..title); else questTitleButton:SetFormattedText(NORMAL_QUEST_DISPLAY, "["..level.."] "..title); end if (QuestGuru_IsQuestComplete(title)) then SetDesaturation(questTitleButtonIcon, nil); else SetDesaturation(questTitleButtonIcon, 1); end end local numAvailableQuests = GetNumAvailableQuests(); for i=(numActiveQuests + 1), (numActiveQuests + numAvailableQuests), 1 do local questTitleButton = _G["QuestTitleButton"..i]; local questTitleButtonIcon = _G[questTitleButton:GetName() .. "QuestIcon"]; local level = GetAvailableLevel(i - numActiveQuests); if (level == -1) then level = "*"; end local title = GetAvailableTitle(i - numActiveQuests); if ( IsAvailableQuestTrivial(i - numActiveQuests) ) then questTitleButton:SetFormattedText(TRIVIAL_QUEST_DISPLAY, "["..level.."] "..title); questTitleButtonIcon:SetVertexColor(0.5,0.5,0.5); else questTitleButton:SetFormattedText(NORMAL_QUEST_DISPLAY, "["..level.."] "..title); questTitleButtonIcon:SetVertexColor(1,1,1); end end end function QuestGuru_QuestDetailShow() local questTitle = GetTitleText(); QuestGuru_UpdateDetailFrame(questTitle, GetGossipAvailableQuests()); end function QuestGuru_UpdateDetailFrame(questTitle, ...) local i; for i=1, select("#", ...), 5 do if (select(i, ...) == questTitle) then QuestInfoTitleHeader:SetText("["..select(i+1, ...).."] "..questTitle); end end end function QuestGuru_QuestProgressShow() local questTitle = GetTitleText(); QuestGuru_UpdateProgressFrame(questTitle, GetGossipActiveQuests()); local i; for i=1, GetNumQuestItems() do local name, texture, numItems, quality, isUsable = GetQuestItemInfo("required", i); local link = GetQuestItemLink("required", i); if (name and link) then QuestGuru_Items[QuestGuru_RealmName][name] = link; end end end function QuestGuru_UpdateProgressFrame(questTitle, ...) local i; for i=1, select("#", ...), 4 do if (select(i, ...) == questTitle) then QuestProgressTitleText:SetText("["..select(i+1, ...).."] "..questTitle); end end end function QuestGuru_GossipShow() local npc = UnitName("npc"); QuestGuru_UpdateGossipFrame(1, true, GetGossipAvailableQuests()); if (GetNumGossipAvailableQuests() > 0) then QuestGuru_UpdateGossipFrame(GetNumGossipAvailableQuests() + 2, false, GetGossipActiveQuests()); else QuestGuru_UpdateGossipFrame(1, false, GetGossipActiveQuests()); end end function QuestGuru_UpdateGossipFrame(currButton, availQuest, ...) local i; local j = 4; if (availQuest) then j=5; end for i=1, select("#", ...), j do local button = _G["GossipTitleButton"..currButton]; local buttonIcon = _G[button:GetName() .. "GossipIcon"]; local level = select(i+1, ...); if (level == -1) then level = "*"; end button:SetFormattedText("[%s] %s", level, select(i, ...)); if (QuestGuru_IsQuestComplete(select(i, ...)) or availQuest) then SetDesaturation(buttonIcon, nil); else SetDesaturation(buttonIcon, 1); end currButton = currButton + 1; end end function QuestGuru_IsQuestComplete(questTitle) local numEntries, numQuests = GetNumQuestLogEntries(); local i; for i=1, numEntries do local questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(i); local numObjectives = GetNumQuestLeaderBoards(i); if (questLogTitleText == questTitle) then return (isComplete or (numObjectives == 0)); end end return false; end local QuestLogFrameX, QuestLogFrameY; function QuestGuru_QuestLog_OnShow() QuestLog_OnShow(); if (QuestLogFrameX ~= nil and QuestLogFrameY ~= nil) then QuestLogFrame:SetPoint("TOPLEFT", QuestLogFrame:GetParent(), "BOTTOMLEFT", QuestLogFrameX, QuestLogFrameY); end end QuestLogFrame:SetScript("OnShow", QuestGuru_QuestLog_OnShow); function QuestGuru_QuestLog_OnHide() QuestLog_OnHide(); QuestLogFrameX = QuestLogFrame:GetLeft(); QuestLogFrameY = QuestLogFrame:GetTop(); end QuestLogFrame:SetScript("OnHide", QuestGuru_QuestLog_OnHide);