vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[

        QuestLevels
        >> http://www.insurgenceguild.com/insurgence/ui_mods.php

        By Halfhand <halfhand@insurgenceguild.com>

        Shows quest levels in the quest log, and speeds up quest text display.
        
        Based on code from Vjeux's QuestMinion mod (<3 QM).
        >> http://www.curse-gaming.com/mod.php?addid=83


        CHANGE LOG:

        v0.3 - 2005.03.28
        - Quests are now automatically removed from the tracker when completed
        - Added flags in tracker level based on quest tag (elite, dungeon, raid)
        - Levels of quests in tracker are now coloured based on difficulty

        v0.2 - 2005.03.26
        - Added quest levels to quest tracker frame
        - Fixed position of check mark next to quest titles in main quest log for
          incomplete quests (was positioned correctly for completed quests)
        - Miscellaneous minor optimizations

        v0.1 - 2005.03.24
        - WoW Build 1300
        - Initial release

]]

-- globals
QUESTLEVELS_VERSION = "0.3";

-- labels
QUESTLEVELS_DUNGEON = "Dungeon";
QUESTLEVELS_RAID = "Raid";

-- disable quest fading
QUEST_FADING_ENABLE = nil;

function QuestLevels_OnLoad()
        -- define pretty-print functions
        if( not Print_Chat ) then 
                Print_Chat = function( x ) if( DEFAULT_CHAT_FRAME ) then DEFAULT_CHAT_FRAME:AddMessage( x, 1.0, 1.0, 0.0 ); end end
    end

        if( not Print_UI ) then
        Print_UI = function( x ) UIErrorsFrame:AddMessage( x, 1.0, 1.0, 0.0, 1.0, UIERRORS_HOLD_TIME ); end
    end

        this:RegisterEvent( "QUEST_LOG_UPDATE" );

        QuestLevels_QuestLog_Update = QuestLog_Update;
        QuestLevels_QuestWatch_Update = QuestWatch_Update;

        function QuestLog_Update()
                QuestLevels_QuestLog_Update();

                local numHeaders = 0;
                local numEntries = GetNumQuestLogEntries();
                
                for i = 1, QUESTS_DISPLAYED, 1 do
                        local questIndex = i + FauxScrollFrame_GetOffset( QuestLogListScrollFrame );
                        local questLogTitle = getglobal( "QuestLogTitle" .. i );
                        local questTitleTag = getglobal( "QuestLogTitle".. i .."Tag" );
                        local questCheck = getglobal( "QuestLogTitle" .. i .. "Check" );
                        local questNormalText = getglobal( "QuestLogTitle" .. i .. "NormalText" );
                        local questHighlightText = getglobal( "QuestLogTitle" .. i .. "HighlightText" );
                        local questDisabledText = getglobal( "QuestLogTitle" .. i .. "DisabledText" );

                        if( questIndex <= numEntries ) then
                                local questLogTitleText, level, questTag, isHeader, isCollapsed, isComplete = GetQuestLogTitle( questIndex );

                                if( level and not isHeader ) then
                                        questLogTitle:SetText( "  [" .. level .. "] " .. questLogTitleText );
                                        QuestLogDummyText:SetText( questLogTitle:GetText() );

                                        -- set the quest tag
                                        if( isComplete ) then
                                                questTag = COMPLETE;
                                        end

                                        if( not questTag ) then
                                                questTitleTag:SetText( "" );

                                                -- reset to max text width
                                                questNormalText:SetWidth( 275 );
                                                questHighlightText:SetWidth( 275 );
                                                questDisabledText:SetWidth( 275 );

                                                -- show check mark if quest is being watched
                                                questCheck:Hide();

                                                if( IsQuestWatched( questIndex ) ) then
                                                        questCheck:SetPoint( "LEFT", questLogTitle:GetName(), "LEFT", QuestLogDummyText:GetWidth() + 24, 0 );
                                                        questCheck:Show();
                                                end
                                        end
                                end
                        end
                end
        end

        function QuestWatch_Update()
                QuestLevels_QuestWatch_Update();

                local numObjectives;
                local questWatchMaxWidth = 0;
                local tempWidth;
                local watchText;
                local watchTextIndex = 1;
                local questIndex;
                local objectivesCompleted;
                local text, type, finished;
                
                for i = 1, GetNumQuestWatches() do
                        local tempIndex = 0;

                        questIndex = GetQuestIndexForWatch(i);

                        if( questIndex ) then
                                numObjectives = GetNumQuestLeaderBoards(questIndex);
                        
                                -- if there are objectives, set the title
                                if ( numObjectives > 0 ) then
                                        -- set title
                                        local questLogTitleText, level, questTag, isHeader, isCollapsed = GetQuestLogTitle( questIndex );

                                        if( level and not isHeader ) then
                                                local diff = GetDifficultyColor( level );
                                                local useTag, levelTag

                                                -- show flags in quest level based on tag
                                                if( questTag == ELITE ) then
                                                        useTag = "+";
                                                elseif ( questTag == QUESTLEVELS_DUNGEON ) then
                                                        useTag = "d";
                                                elseif ( questTag == QUESTLEVELS_RAID ) then
                                                        useTag = "r";
                                                else
                                                        useTag = "";
                                                end

                                                -- color quest level based on difficulty
                                                levelTag = format( "|c%02X%02X%02X%02X%s|r", 255, diff.r * 255, diff.g * 255, diff.b * 255,
                                                        "[" .. level .. useTag .. "] " );

                                                watchText = getglobal( "QuestWatchLine" .. watchTextIndex );
                                                watchText:SetText( levelTag .. GetQuestLogTitle( questIndex ) );

                                                tempWidth = watchText:GetWidth();

                                                if( tempWidth > questWatchMaxWidth ) then
                                                        questWatchMaxWidth = tempWidth;
                                                end

                                                objectivesCompleted = 0;

                                                for j = 1, numObjectives do
                                                        text, type, finished = GetQuestLogLeaderBoard( j, questIndex );
                                                        tempIndex = watchTextIndex + j;

                                                        watchText = getglobal( "QuestWatchLine" .. tempIndex );

                                                        if( finished ) then
                                                                objectivesCompleted = objectivesCompleted + 1;
                                                        end

                                                        if( objectivesCompleted == numObjectives ) then
                                                                -- spam quest completion message
                                                                Print_UI( "[" .. level .. "] " .. GetQuestLogTitle( questIndex ) .. " (Complete)" );

                                                                -- remove completed quest from tracker
                                                                RemoveQuestWatch( questIndex );
                                                                QuestWatch_Update();
                                                        else
                                                                tempWidth = watchText:GetWidth();

                                                                -- adjust tracker width there are incomplete objectives
                                                                if( tempWidth > questWatchMaxWidth ) then
                                                                        questWatchMaxWidth = tempWidth;
                                                                end
                                                        end
                                                end
                                        end
                                end

                                watchTextIndex = watchTextIndex + 1 + numObjectives;
                        end
                end

                -- update width of tracker frame
                QuestWatchFrame:SetWidth( questWatchMaxWidth + 10 );
        end

        -- print mod version/load info to chat frame
        -- Print_Chat( "QuestLevels " .. QUESTLEVELS_VERSION .. " AddOn loaded" );
end