vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
--      Sea.wow.questLog
--              Basic Quest Log Functions
--
--      $LastChangedBy: Miravlix $
--      $Rev: 3231 $
--      $Date: 2006-03-26 00:30:16 -0600 (Sun, 26 Mar 2006) $
--]]

Sea.wow.questLog = {
        -- Quest Log Max
        QUESTLOG_MAX = 20;

        -- Protection Data
        ProtectionData = {};

        --
        --      storeCollapsedQuests
        --
        --       Stores the currently collapsed quests and returns them
        --
        -- Returns:
        --      (table quests)
        --      quests - a list containing the title of the collapsed quests
        --
        storeCollapsedQuests = function ()
                local collapsed = {};
                for i=1, Sea.wow.questLog.QUESTLOG_MAX do
                        local title, level, questTag, isHeader, isCollapsed, isComplete = GetQuestLogTitle(i);
                        if ( isCollapsed ) then
                                table.insert(collapsed, title);
                        end
                end

                return collapsed;
        end;

        --
        --      collapseStoredQuests (collapseTitles)
        --              Collapses all quests whose titles are in the list
        --
        -- Args:
        --      (table collapseTitles)
        --      collapseTitles - the titles which will be collapsed
        --
        -- Returns:
        --      nil
        --
        collapseStoredQuests = function (collapseThese)
                for i=1, Sea.wow.questLog.QUESTLOG_MAX do
                        local title, level, questTag, isHeader, isCollapsed, isComplete = GetQuestLogTitle(i);
                        if ( Sea.list.isInList(collapseThese, title) ) then
                                CollapseQuestHeader(i);
                        end
                end
        end;


        --
        --      protectQuestLog()
        --              Preserves the quest log state.
        --              Don't forget to call unprotectQuestLog()
        --              after modifying the log.
        --
        --              This will return false if someone else
        --              has protected the quest log and
        --              not unprotected it yet.
        --
        --      Args:
        --              none
        --      Returns:
        --              true - the log was protected
        --              false - someone else is modifying the log now
        --
        protectQuestLog = function ()
                if ( Sea.wow.questLog.ProtectionData.protected ) then
                        return nil;
                end

                -- Store the protected state
                Sea.wow.questLog.ProtectionData.protected = true;

                -- Store the event
                Sea.wow.questLog.ProtectionData.ql_OnEvent = QuestLog_OnEvent;
                QuestLog_OnEvent = function() end;

                -- Store the collapsed
                Sea.wow.questLog.ProtectionData.collapsed = Sea.wow.questLog.storeCollapsedQuests();

                -- Store the selection
                Sea.wow.questLog.ProtectionData.savedID = GetQuestLogSelection();

                -- Store the scroll bar position
                Sea.wow.questLog.ProtectionData.savedScrollBar = FauxScrollFrame_GetOffset(QuestLogListScrollFrame);
                Sea.wow.questLog.ProtectionData.savedValue = QuestLogListScrollFrameScrollBar:GetValue()

                return true;
        end;

        --
        --      unprotectQuestLog()
        --              Restores the state of the quest log.
        --              Useful if you're going to mess with the
        --              quest log in order to get info out, and
        --              don't want the user to notice.
        --
        --      Args:
        --              none
        --      Returns:
        --              nil
        --
        unprotectQuestLog = function ()
                -- Collapse again
                Sea.wow.questLog.collapseStoredQuests(Sea.wow.questLog.ProtectionData.collapsed);

                -- Restore the scroll bar position
                FauxScrollFrame_SetOffset(QuestLogListScrollFrame,Sea.wow.questLog.ProtectionData.savedScrollBar)
                QuestLogListScrollFrameScrollBar:SetValue( Sea.wow.questLog.ProtectionData.savedValue )
                
                -- Restore the selection
                SelectQuestLogEntry(Sea.wow.questLog.ProtectionData.savedID);

                -- Restore the event
                QuestLog_OnEvent = Sea.wow.questLog.ProtectionData.ql_OnEvent;
                Sea.wow.questLog.ProtectionData.ql_OnEvent = nil;

                -- Unprotect
                Sea.wow.questLog.ProtectionData.protected = false;
        end;

        --
        --      getPlayerQuestTree()
        --              Returns a formatted table containing all of
        --              the quests the player currently has.
        --
        --      Returns:
        --
        --      questTree  - list of zones
        --      {
        --              ["zone name"] - list of quests
        --              {
        --                      {
        --                              flatid - (string) id when fully expanded
        --                              title - (string) quest title
        --                              level - (number) quest level
        --                              tag - (string) Elite or Raid
        --                              complete - (boolean) is quest completed
        --                      }
        --              }
        --      }
        --
        getPlayerQuestTree = function()
                if ( not Sea.wow.questLog.protectQuestLog() ) then
                        return nil;
                end

                -- Expand everything
                ExpandQuestHeader(0);

                -- Build our quest list
                local numEntries, numQuests = GetNumQuestLogEntries();

                local questList = {};
                local activeTable = nil;

                for i=1, Sea.wow.questLog.QUESTLOG_MAX + numEntries, 1 do
                        local questIndex = i;
                        if ( questIndex <= numEntries ) then
                                local title, level, questTag, isHeader, isCollapsed, isComplete = GetQuestLogTitle(questIndex);
                                local color;
                                if ( title ) then
                                        if ( isHeader ) then
                                                questList[title] = {};
                                                activeTable = questList[title];
                                        else
                                                if ( activeTable == nil ) then
                                                        activeTable = questList;
                                                end

                                                local entry = {};
                                                entry.id = i;
                                                entry.flatid = i;
                                                entry.title = title;
                                                entry.level = level;
                                                entry.tag = questTag;
                                                entry.complete = isComplete;

                                                table.insert(activeTable, entry);
                                        end
                                end
                        end
                end

                -- Unprotect
                Sea.wow.questLog.unprotectQuestLog();

                return questList;

        end;

        --
        --      getPlayerQuestTreeFlat()
        --              Returns a flat table containing all of
        --              the quests the player currently has.
        --
        --      Returns:
        --
        --      questTree  - table of quests, the key in this table equals id
        --      {
        --              {
        --                      id - (string) id when fully expanded
        --                      title - (string) quest title
        --                      level - (number) quest level
        --                      tag - (string) Elite or Raid
        --                      complete - (boolean) is quest completed
        --                      zone - (string) collapsable header name
        --              }
        --      }
        --
        getPlayerQuestTreeFlat = function()
                if ( not Sea.wow.questLog.protectQuestLog() ) then
                        return nil;
                end

                -- Expand everything
                ExpandQuestHeader(0);

                -- Build our quest list
                local numEntries = GetNumQuestLogEntries();

                local questList = {};
                local currentZone;

                for questIndex=1, numEntries, 1 do
                        local title, level, questTag, isHeader, isCollapsed, isComplete = GetQuestLogTitle(questIndex);
                        if ( title ) then
                                if ( isHeader ) then
                                        currentZone = title;
                                else
                                        local entry =
                                        {
                                                id = questIndex;
                                                title = title;
                                                level = level;
                                                tag = questTag;
                                                complete = isComplete;
                                                zone = currentZone
                                        };

                                        questList[questIndex] = entry;
                                end
                        end
                end

                -- Unprotect
                Sea.wow.questLog.unprotectQuestLog();

                return questList;
        end;

        -- 
        --
        --      convertPlayerQuestTreeFromFlatToNormal()
        --              Converts output of getPlayerQuestTreeFlat to format of
        --              output of getPlayerQuestTree. It's shallow copy: doesn't 
        --              copy actual quest entries, just reference them.
        --
        --      Args:
        --              tree - table of quests as returned by getPlayerQuestTreeFlat
        --
        --      Returns:
        --
        --      See getPlayerQuestTree.
        --
        convertPlayerQuestTreeFromFlatToNormal = function(tree)
                if not tree then
                        return;
                end
                local currentZone;
                local result = {};
                for k,v in tree do
                        if v.zone ~= currentZone then
                                currentZone = v.zone;

                                if result[currentZone] == nil then -- Only Zap when NIL!
                                   result[currentZone] = {};
                                end
                        end
                        v.flatid = v.id;
                        table.insert(result[currentZone], v);
                end
                return result;
        end;

        --
        --      getPlayerQuestData ( number id )
        --
        --              Returns a formatted table containing the quest's information
        --              If you specify its id when the table is flat.
        --
        --      Args:
        --              id - flattened (expanded) id of the quest
        --
        --      Returns:
        --              questData - (table)
        --              {
        --                      id - flattened id (number)
        --                      title - quest title (string)
        --                      level - quest level (number)
        --                      tag - quest tag (string)
        --                      failed - (boolean)
        --                      pushable - (boolean)
        --                      timer - (number)
        --                      description - full description text (string)
        --                      objective - objective text (string)
        --                      objectives - objective status (table)
        --                              {
        --                                      text - description (string)
        --                                      questType - monster, reputation or item (string)
        --                                      finished - (boolean)
        --                                      info - status information (table)
        --                                      {
        --                                              name - monster/item/faction name
        --                                              done    - number - number obtained or killed
        --                                                      - string - faction achieved
        --                                              total   - number - amount needed
        --                                                      - string - faction required
        --                                      }
        --                              }
        --                      choices - choices of items (table)
        --                              {
        --                                      name - item name
        --                                      texture - item texture
        --                                      numItems - count of items (number)
        --                                      quality - item quality (number)
        --                                      isUsable - (boolean)
        --                                      info - link information (table)
        --                                              {
        --                                                      color - color string (string)
        --                                                      link - item link (string)
        --                                                      linkname - [Item of Power] (string)
        --                                              }
        --                              }
        --                      rewards - items always recieved (table)
        --                              {
        --                                      name - item name
        --                                      texture - item texture
        --                                      numItems - count of items (number)
        --                                      quality - item quality (number)
        --                                      isUsable - (boolean)
        --                                      info - link information (table)
        --                                              {
        --                                                      color - color string (string)
        --                                                      link - item link (string)
        --                                                      linkname - [Item of Power] (string)
        --                                              }
        --                              }
        --                      spellReward - the spell given to you after the quest (table)
        --                              {
        --                                      name - spell name (string)
        --                                      texture - spell texture (string)
        --                              }
        --              }
        --
        getPlayerQuestData = function ( id )
                if ( not Sea.wow.questLog.protectQuestLog() ) then
                        return false;
                end

                if ( not id ) then
                        -- Unprotect
                        Sea.wow.questLog.unprotectQuestLog();
                        return nil;
                end

                local questInfo = {};

                -- Expand everything
                ExpandQuestHeader(0);

                -- Select it
                SelectQuestLogEntry(id);

                questInfo.id = id;
                questInfo.title, questInfo.level, questInfo.tag = GetQuestLogTitle(id);
                questInfo.failed = IsCurrentQuestFailed();
                questInfo.description, questInfo.objective = GetQuestLogQuestText();
                questInfo.pushable = GetQuestLogPushable();
                questInfo.timer = GetQuestLogTimeLeft();

                questInfo.objectives = {};

                for i=1, GetNumQuestLeaderBoards(), 1 do
                        local item = {};

                        item.text, item.questType, item.finished = GetQuestLogLeaderBoard(i);

                        if ( item.questType == "item" ) then
                                local realGlobal = QUEST_ITEMS_NEEDED;
                                QUEST_ITEMS_NEEDED = "%s:%d:%d";
                                local info = Sea.string.split(GetQuestLogLeaderBoard(i),":");
                                QUEST_ITEMS_NEEDED = realGlobal;

                                item.info = {};
                                item.info.name = info[1];
                                item.info.done = tonumber(info[2]);
                                item.info.total = tonumber(info[3]);
                        elseif ( item.questType == "monster" ) then
                                local realGlobal = QUEST_MONSTERS_KILLED;
                                QUEST_MONSTERS_KILLED = "%s:%d:%d";
                                local info = Sea.string.split(GetQuestLogLeaderBoard(i),":");
                                QUEST_MONSTERS_KILLED = realGlobal;

                                item.info = {};
                                item.info.name = info[1];
                                item.info.done = tonumber(info[2]);
                                item.info.total = tonumber(info[3]);
                        elseif ( item.questType == "reputation" ) then
                                local realGlobal = QUEST_FACTION_NEEDED;
                                QUEST_FACTION_NEEDED = "%s:%s:%s";
                                local info = Sea.string.split(GetQuestLogLeaderBoard(i),":");
                                QUEST_FACTION_NEEDED = realGlobal;

                                item.info = {};
                                item.info.name = info[1];
                                item.info.done = info[2];
                                item.info.total = info[3];
                        end
                        table.insert(questInfo.objectives, item);
                end

                if ( GetQuestLogRequiredMoney() > 0 ) then
                        questInfo.requiredMoney = GetQuestLogRequiredMoney();
                end
                questInfo.rewardMoney = GetQuestLogRewardMoney();

                questInfo.rewards = {};
                questInfo.choices = {};

                for i=1, GetNumQuestLogChoices(), 1 do
                        local item = {};
                        item.name, item.texture, item.numItems, item.quality, item.isUsable = GetQuestLogChoiceInfo(i);

                        local info = GetQuestLogItemLink("choice", i );
                        if ( info ) then
                                item.info = {};
                                item.info.color = string.gsub(info, "|c(.*)|H(.*)|h(.*)|h|r.*", "%1");
                                item.info.link = string.gsub(info, "|c(.*)|H(.*)|h(.*)|h|r.*", "%2");
                                item.info.linkname = string.gsub(info, "|c(.*)|H(.*)|h(.*)|h|r.*", "%3");
                        end
                        table.insert(questInfo.choices, item);
                end
                for i=1, GetNumQuestLogRewards(), 1 do
                        local item = {};
                        item.name, item.texture, item.numItems, item.quality, item.isUsable = GetQuestLogRewardInfo(i);

                        local info = GetQuestLogItemLink("reward", i );
                        if ( info ) then
                                item.info = {};
                                item.info.color = string.gsub(info, "|c(.*)|H(.*)|h(.*)|h|r.*", "%1");
                                item.info.link = string.gsub(info, "|c(.*)|H(.*)|h(.*)|h|r.*", "%2");
                                item.info.linkname = string.gsub(info, "|c(.*)|H(.*)|h(.*)|h|r.*", "%3");
                        end

                        table.insert(questInfo.rewards, item);
                end

                if ( GetRewardSpell() ) then
                        questInfo.spellReward={};
                        questInfo.spellReward.texture, questInfo.spellReward.name = GetQuestLogRewardSpell();
                end

                -- Unprotect
                Sea.wow.questLog.unprotectQuestLog();

                return questInfo;
        end;
};