vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- Storage of Quest levels...
-- All credits go to Elkano for his addon Quest Level


-- ---------------------- --
-- hooking game functions --
-- ---------------------- --
local QuestLevel_original_GetTitleText = GetTitleText;

-- GossipFrame
-- local QuestLevel_original_GossipFrameUpdate = GossipFrameUpdate;
local QuestLevel_original_GetGossipAvailableQuests = GetGossipAvailableQuests;
local QuestLevel_original_GetGossipActiveQuests = GetGossipActiveQuests;

-- QuestFrame
-- local QuestLevel_original_QuestFrameGreetingPanel_OnShow = QuestFrameGreetingPanel_OnShow;
local QuestLevel_original_GetActiveTitle = GetActiveTitle;
local QuestLevel_original_GetAvailableTitle = GetAvailableTitle;


-- -------------- --
-- storage system --
-- -------------- --

QuestLevel_StorageKeys = { };
QuestLevel_StorageKeys["levelmin"] = "<";
QuestLevel_StorageKeys["levelmax"] = ">";
QuestLevel_StorageKeys["elite"] = "@";

function QuestLevel_StorageSet(storage, key, value)
        if (not QuestLevel_StorageKeys[key]) then
                return storage;
        end
        if (storage == nil) then
                storage = "";
        end
        local storagearray = {};
        for storagekey, storagevalue in QuestLevel_StorageKeys do
                s1, s2, storagearray[storagekey] = string.find(storage, storagevalue.."(.-)¤");
        end
        storagearray[key] = value;
        local newstorage = "";
        for storagekey, storagevalue in storagearray do
                newstorage = newstorage..QuestLevel_StorageKeys[storagekey]..storagevalue.."¤";
        end
        return newstorage;
end

function QuestLevel_StorageGet(storage, key)
        if (not QuestLevel_StorageKeys[key]) then
                return nil;
        end
        if (storage == nil) then
                storage = "";
        end
        s1, s2, value = string.find(storage, QuestLevel_StorageKeys[key].."(.-)¤");
        if ( value ) then
                return value;
        else
                return nil;
        end
end


-- -------------- --
-- main functions --
-- -------------- --

local function QuestLevel_VariablesLoaded()
        if( not QuestLevel_Quest2Level ) then
                QuestLevel_Quest2Level = { };
        end

        -- convert to now storage -- beta2
        for quest, data in QuestLevel_Quest2Level do
                if ( type(data) == "table" or string.find(data, QuestLevel_StorageKeys["levelmin"]) == nil ) then
                        if ( type(data) == "table" ) then
                                local queststorage = "";
                                queststorage = QuestLevel_StorageSet(queststorage, "levelmin", data["min"]);
                                queststorage = QuestLevel_StorageSet(queststorage, "levelmax", data["max"]);
                                QuestLevel_Quest2Level[quest] = queststorage;
                        else
                                local queststorage = "";
                                queststorage = QuestLevel_StorageSet(queststorage, "levelmin", data);
                                QuestLevel_Quest2Level[quest] = queststorage;
                        end
                else
                        break; -- data is validstorage -> table had been converted before
                end
        end

        -- convert to now storage -- beta3
        for quest, data in QuestLevel_Quest2Level do
                local levelmin = QuestLevel_StorageGet(data, "levelmin");
                local levelmax = QuestLevel_StorageGet(data, "levelmax");
                if ( levelmax == nil ) then
                        break; -- data is validstorage -> table had been converted before
                end
                if ( tonumber(levelmin) >= tonumber(levelmax) ) then
                        data = QuestLevel_StorageSet(data, "levelmax", nil);
                        QuestLevel_Quest2Level[quest] = data;
                end
        end
end

function QuestLevel_OnLoad()
        this:RegisterEvent("VARIABLES_LOADED");

        if( DEFAULT_CHAT_FRAME ) then
                DEFAULT_CHAT_FRAME:AddMessage("Elkano's QuestLevel AddOn v2.0 loaded");
        end
end

function QuestLevel_OnEvent()
        if( event == "VARIABLES_LOADED" ) then
                QuestLevel_VariablesLoaded();
        end
end

local function QuestLevel_AddLevelFromTable(questname)
        if ( QuestLevel_Quest2Level[questname] ) then
                local levelmin = tonumber(QuestLevel_StorageGet(QuestLevel_Quest2Level[questname], "levelmin"));
                local levelmax = QuestLevel_StorageGet(QuestLevel_Quest2Level[questname], "levelmax");
                if ( levelmax == nil ) then
                        levelmax = levelmin;
                else
                        levelmax = tonumber(levelmax);
                end
                local leveltag = "";
                if ( levelmin < levelmax ) then
                        leveltag = leveltag..levelmin.."-"..levelmax;
                else
                        leveltag = leveltag..levelmin;
                end
                if (QuestLevel_StorageGet(QuestLevel_Quest2Level[questname], "elite") ~= nil) then
                        leveltag = leveltag.."+";
                end
                return "["..leveltag.."] "..questname;
        end
        return "[?] "..questname;
end

function GetTitleText()
        if ( QuestlogOptions[EQL3_Player].ShowQuestLevels == 1 and QuestlogOptions[EQL3_Player].OnlyLevelsInLog == 0 ) then
                local titletext = QuestLevel_original_GetTitleText();
        --      if( DEFAULT_CHAT_FRAME ) then
        --              DEFAULT_CHAT_FRAME:AddMessage("[QuestLevel] DEBUG: GetTitleText -> "..titletext);
        --      end
                return QuestLevel_AddLevelFromTable(titletext);
        else
                -- still stor the quests..
                local titletext = QuestLevel_original_GetTitleText();
                QuestLevel_AddLevelFromTable(titletext);
                
                return QuestLevel_original_GetTitleText();
        end
end

local function QuestLevel_table2args(intable)
        if ( intable.n == 0 ) then
                return;
        elseif ( intable.n == 1 ) then
                return intable[1];
        else
                return table.remove(intable, 1), QuestLevel_table2args(intable);
        end
end

local function QuestLevel_addLevelGossip(...)
        if ( arg.n == 0) then
                return
        end
        for i=1, arg.n, 2 do
--              if( DEFAULT_CHAT_FRAME ) then
--                      DEFAULT_CHAT_FRAME:AddMessage("[QuestLevel] DEBUG: arg["..i.."] -> "..arg[i]);
--              end
                arg[i] = QuestLevel_AddLevelFromTable(arg[i]);
        end
        return QuestLevel_table2args(arg);
end

-- function GossipFrameUpdate()
--      if( DEFAULT_CHAT_FRAME ) then
--              DEFAULT_CHAT_FRAME:AddMessage("[QuestLevel] DEBUG: |cffffff00GossipFrameUpdate|r called");
--      end
--      return QuestLevel_original_GossipFrameUpdate();
-- end

function GetGossipAvailableQuests()
--      if( DEFAULT_CHAT_FRAME ) then
--              DEFAULT_CHAT_FRAME:AddMessage("[QuestLevel] DEBUG: |cffffff00GetGossipAvailableQuests|r called");
--      end
        if ( QuestlogOptions[EQL3_Player].ShowQuestLevels == 1 and QuestlogOptions[EQL3_Player].OnlyLevelsInLog == 0 ) then
                return QuestLevel_addLevelGossip(QuestLevel_original_GetGossipAvailableQuests());
        else
                return QuestLevel_original_GetGossipAvailableQuests();
        end
end

function GetGossipActiveQuests()
--      if( DEFAULT_CHAT_FRAME ) then
--              DEFAULT_CHAT_FRAME:AddMessage("[QuestLevel] DEBUG: |cffffff00GetGossipActiveQuests|r called");
--      end
        if ( QuestlogOptions[EQL3_Player].ShowQuestLevels == 1 and QuestlogOptions[EQL3_Player].OnlyLevelsInLog == 0 ) then
                return QuestLevel_addLevelGossip(QuestLevel_original_GetGossipActiveQuests());
        else
                return QuestLevel_original_GetGossipActiveQuests();
        end
end

-- function QuestFrameGreetingPanel_OnShow()
--      if( DEFAULT_CHAT_FRAME ) then
--              DEFAULT_CHAT_FRAME:AddMessage("[QuestLevel] DEBUG: |cffffff00QuestFrameGreetingPanel_OnShow|r called");
--      end
--      return QuestLevel_original_QuestFrameGreetingPanel_OnShow();
-- end

function GetActiveTitle(i)
--      if( DEFAULT_CHAT_FRAME ) then
--              DEFAULT_CHAT_FRAME:AddMessage("[QuestLevel] DEBUG: |cffffff00GetActiveTitle("..i..")|r called");
--      end
        if ( QuestlogOptions[EQL3_Player].ShowQuestLevels == 1 and QuestlogOptions[EQL3_Player].OnlyLevelsInLog == 0 ) then
                return QuestLevel_AddLevelFromTable(QuestLevel_original_GetActiveTitle(i));
        else
                return QuestLevel_original_GetActiveTitle(i);
        end
end

function GetAvailableTitle(i)
--      if( DEFAULT_CHAT_FRAME ) then
--              DEFAULT_CHAT_FRAME:AddMessage("[QuestLevel] DEBUG: |cffffff00GetAvailableTitle("..i..")|r called");
--      end
        if ( QuestlogOptions[EQL3_Player].ShowQuestLevels == 1 and QuestlogOptions[EQL3_Player].OnlyLevelsInLog == 0 ) then
                return QuestLevel_AddLevelFromTable(QuestLevel_original_GetAvailableTitle(i));
        else
                return QuestLevel_original_GetAvailableTitle(i);
        end
end