vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
----------------------------------------------------------
-- Add tooltip information to the existing GameTooltip
----------------------------------------------------------
----------------------------------------------------------
function QuestItem_AddTooltip(frame, name, link, quantity, itemCount)
        --QuestItem_OldTooltip(frame, name, link, quality, itemCount);
        if(QuestItem_Settings["Enabled"] == nil or QuestItem_Settings["Enabled"] == false) then
                return;
        end
        
        local tooltip = frame;
        local embed = true;
    if ( not tooltip ) then
                return;
    end
        
    local tooltipInfo = QuestItem_ScanTooltip(frame);
    if ( tooltipInfo[1] ) then
                -- Item not found in the database - look for it of it is a quest item
                if(not QuestItems[name] or QuestItem_SearchString(QuestItems[name].QuestName, QUESTITEM_UNIDENTIFIED) ) then
                        -- Check if the item is a Quest Item
                        if(QuestItem_IsQuestItem(tooltip) ) then
                                local name = tooltipInfo[1].left;

                                local QuestName, total, count, texture = QuestItem_FindQuest(name);
                                if(not QuestName) then
                                        QuestItem_UpdateItem(name, QUESTITEM_UNIDENTIFIED, quantity, 0, 3)
                                else
                                        QuestItem_UpdateItem(name, QuestName, count, total, 0)
                                end
                        end
                end
                -- Quest was found in the database
                if(QuestItems[name]) then
                        -- There is data for the current player
                        if(QuestItems[name][UnitName("player")]) then
                                -- Total and Count is set, and is grater than 0 - don't want to display i.e 1/0
                                if( (QuestItems[name].Total and QuestItems[name].Total > 0) and (QuestItems[name][UnitName("player")].Count and QuestItems[name][UnitName("player")].Count > 0) ) then
                                        tooltip:AddLine(QuestItems[name].QuestName .. " " .. QuestItems[name][UnitName("player")].Count .. "/" .. QuestItems[name].Total, 0.4, 0.5, 0.8);
                                else
                                        tooltip:AddLine(QuestItems[name].QuestName, 0.4, 0.5, 0.8);
                                end
                                
                                -- Check status for quest - if it can't be found change status to abandoned/complete
                                if(QuestItems[name][UnitName("player")].QuestStatus ~= 0) then
                                        if(not QuestItem_FindQuest(name)) then
                                                QuestItems[name][UnitName("player")].QuestStatus = 1;
                                        end
                                end
                                -- Do not display status on the quest if it is unidentified
                                if(not QuestItem_SearchString(QuestItems[name].QuestName, QUESTITEM_UNIDENTIFIED) ) then
                                        -- Display quest status
                                        if(QuestItems[name][UnitName("player")].QuestStatus == 0) then
                                                tooltip:AddLine(QUESTITEM_QUESTACTIVE, 0, 1, 0);
                                        elseif(QuestItems[name][UnitName("player")].QuestStatus == 1 or QuestItems[name][UnitName("player")].QuestStatus == 2) then
                                                tooltip:AddLine(QUESTITEM_COMPLETEABANDONED, 0.7, 0.7, 07);
                                        end
                                end
                        else
                                tooltip:AddLine(QuestItems[name].QuestName, 0.4, 0.5, 0.8);
                        end
                        tooltip:Show();
                end
        end
end

local base_ContainerFrameItemButton_OnEnter;
local base_Chat_OnHyperlinkShow;
local base_GameTooltip_SetLootItem;
local base_ContainerFrame_Update;
local base_GameTooltip_SetInventoryItem;
local base_AIOI_ModifyItemTooltip;
local base_LootLinkItemButton_OnEnter;
local base_IMInv_ItemButton_OnEnter
local base_ItemsMatrixItemButton_OnEnter;
local base_ContainerFrameItemButton_OnClick;
local base_QuestItem_AIOI_ContainerFrameItemButton_OnClick;
local base_BankFrameItemButtonGeneric_OnClick;
local base_BankFrameItemButtonBag_OnClick;
--local base_EngInventory_ModifyItemTooltip;

----------------------------------
-- [[ Hook tooltip functions ]] --
----------------------------------
function QuestItem_HookTooltip()
        -- Hook in alternative Chat/Hyperlinking code
        base_Chat_OnHyperlinkShow = ChatFrame_OnHyperlinkShow;
        ChatFrame_OnHyperlinkShow = QuestItem_Chat_OnHyperlinkShow;
                
        -- ContainerFrame
        base_ContainerFrameItemButton_OnEnter = ContainerFrameItemButton_OnEnter;
        ContainerFrameItemButton_OnEnter = QuestItem_ContainerFrameItemButton_OnEnter;
        base_ContainerFrame_Update = ContainerFrame_Update;
        ContainerFrame_Update = QuestItem_ContainerFrameItemButton_Update;

        base_GameTooltip_SetLootItem = GameTooltip.SetLootItem;
        GameTooltip.SetLootItem = QuestItem_GameTooltip_SetLootItem;
        
        base_GameTooltip_SetInventoryItem = GameTooltip.SetInventoryItem;
        GameTooltip.SetInventoryItem = QuestItem_GameTooltip_SetInventoryItem;

        --[[ LootLink support - grabbed from Norganna's EnhTooltip ]]--
        -- Hook the LootLink tooltip function
        if(LootLinkItemButton_OnEnter ~= nil) then
                base_LootLinkItemButton_OnEnter = LootLinkItemButton_OnEnter;
                LootLinkItemButton_OnEnter = QuestItem_LootLinkItemButton_OnEnter;
                QuestItem_Debug("Hooking to LootLink");
        end

        --[[ AllInOneInventory support - grabbed from Norganna's EnhTooltip ]]--
        if (AllInOneInventory_ModifyItemTooltip ~= nil) then
                base_AIOI_ModifyItemTooltip = AllInOneInventory_ModifyItemTooltip;
                AllInOneInventory_ModifyItemTooltip = QuestItem_AIOI_ModifyItemTooltip;
                QuestItem_Debug("Hooking to AIOI");
        end
        
        -- Hook click on inventory item
        if(AllInOneInventoryFrameItemButton_OnClick ~= nil) then
                base_ContainerFrameItemButton_OnClick = AllInOneInventoryFrameItemButton_OnClick;
                AllInOneInventoryFrameItemButton_OnClick = QuestItem_ContainerFrameItemButton_OnClick;
        else
                base_ContainerFrameItemButton_OnClick = ContainerFrameItemButton_OnClick;
                ContainerFrameItemButton_OnClick = QuestItem_ContainerFrameItemButton_OnClick;
        end
        
        -- Hook bank item 
        base_BankFrameItemButtonGeneric_OnClick = BankFrameItemButtonGeneric_OnClick;
        BankFrameItemButtonGeneric_OnClick = QuestItem_BankFrameItemButtonGeneric_OnClick;
        
        --base_BankFrameItemButtonBag_OnClick = BankFrameItemButtonBag_OnClick;
        --BankFrameItemButtonBag_OnClick = QuestItem_BankFrameItemButtonBag_OnClick;
        
        
        -- [[
        if(EngInventory_ModifyItemTooltip ~= nil) then
                base_EngInventory_ModifyItemTooltip = EngInventory_ModifyItemTooltip;
                EngInventory_ModifyItemTooltip = QuestItem_AIOI_ModifyItemTooltip;
                QuestItem_Debug("Hooking to EngInventory");
        end
        -- ]] --
end

--[[ LootLink support - grabbed from Norganna's EnhTooltip ]]--
function QuestItem_getLootLinkLink(name)
        local itemLink = ItemLinks[name];
        if (itemLink and itemLink.c and itemLink.i and LootLink_CheckItemServer(itemLink, QuestItem_getLootLinkServer())) then
                local item = string.gsub(itemLink.i, "(%d+):(%d+):(%d+):(%d+)", "%1:0:%3:%4");
                local link = "|c"..itemLink.c.."|Hitem:"..item.."|h["..name.."]|h|r";
                return link;
        end
        return nil;
end

function QuestItem_getLootLinkServer()
        return LootLinkState.ServerNamesToIndices[GetCVar("realmName")];
end

--[[ LootLink support - grabbed from Norganna's EnhTooltip ]]--
function QuestItem_LootLinkItemButton_OnEnter()
        base_LootLinkItemButton_OnEnter();

        local name = this:GetText();
        local link = QuestItem_getLootLinkLink(name);
        if (link) then
                local quality = QuestItem_qualityFromLink(link);
                QuestItem_AddTooltip(LootLinkTooltip, name, link, quality, 0)
        end
end

--------------------------------------------------
-- [[ Hook up with AllInOneInventory tooltip ]] --
--------------------------------------------------
function QuestItem_AIOI_ModifyItemTooltip(bag, slot, tooltipName, empty)
        if(base_AIOI_ModifyItemTooltip ~= nil) then
                base_AIOI_ModifyItemTooltip(bag, slot, tooltipName);
        elseif(base_EngInventory_ModifyItemTooltip ~= nil) then
                base_EngInventory_ModifyItemTooltip(bag, slot, tooltipName, nil);
        end
        local tooltip = getglobal(tooltipName);
        if (not tooltip) then
                tooltip = getglobal("GameTooltip");
        end
        
        if (not tooltip) then 
                return false; 
        end

        local link = GetContainerItemLink(bag, slot);
        local name = QuestItem_nameFromLink(link);
        if (name) then
                local texture, itemCount, locked, quality, readable = GetContainerItemInfo(bag, slot);
                if (quality == nil) then 
                        quality = QuestItem_qualityFromLink(link); 
                end
                QuestItem_AddTooltip(GameTooltip, name, link, itemCount, 0)
        end
end
--------------------------------------
-- [[ Set tooltip for bank items ]] --
--------------------------------------
function QuestItem_GameTooltip_SetInventoryItem(userData, unit, slot)
        local hasItem, hasCooldown, repairCost = base_GameTooltip_SetInventoryItem(userData, unit, slot);
        local link = GetInventoryItemLink(unit, slot);
        if (link) then
                local name = QuestItem_nameFromLink(link);
                local quantity = GetInventoryItemCount(unit, slot);
                local quality = GetInventoryItemQuality(unit, slot);
                if (quality == nil) 
                        then quality = QuestItem_qualityFromLink(link); 
                end
                QuestItem_AddTooltip(GameTooltip, name, link, quality, quantity)
        end
        return hasItem, hasCooldown, repairCost;
end

--------------------------------------
-- [[ Set tooltip for loot items ]] --
--------------------------------------
function QuestItem_GameTooltip_SetLootItem(this, slot)
        base_GameTooltip_SetLootItem(this, slot);
        local link = GetLootSlotLink(slot);
        local name = QuestItem_nameFromLink(link);
        if (name) then
                local texture, item, quantity, quality = GetLootSlotInfo(slot);
                
                if (quality == nil) then 
                        quality = QuestItem_qualityFromLink(link); 
                end

                QuestItem_AddTooltip(GameTooltip, name, link, quantity, quantity)
        end
end

------------------------------------------------------
-- [[ QuestItem_ContainerFrameItemButton_OnEnter ]] --
------------------------------------------------------
function QuestItem_ContainerFrameItemButton_OnEnter()
        base_ContainerFrameItemButton_OnEnter();
        local frameID = this:GetParent():GetID();
        local buttonID = this:GetID();
        local link = GetContainerItemLink(frameID, buttonID);
        local name = QuestItem_nameFromLink(link);
        
        if (name) then
                local texture, itemCount, locked, quality, readable = GetContainerItemInfo(frameID, buttonID);
                if (quality==nil or quality==-1) then 
                        quality = QuestItem_qualityFromLink(link); 
                end

                QuestItem_AddTooltip(GameTooltip, name, link, quantity, itemCount)
        end
end

------------------------------------
-- Hook for click on container items
------------------------------------
------------------------------------
function QuestItem_ContainerFrameItemButton_OnClick(button, ignoreModifiers)
        local executeBase = true;
        if(QuestItem_Settings["AltOpen"] == true) then
                if(button == "RightButton" and not ignoreModifiers and IsAltKeyDown()) then
                        local bag, slot;
                        -- Look for bag and slot id
                        if(AllInOneInventoryFrameItemButton_OnClick ~= nil) then
                                bag, slot = AllInOneInventory_GetIdAsBagSlot(this:GetID());
                        else
                                bag = this:GetParent():GetID();         
                                slot = this:GetID();
                        end
                        
                        local link = GetContainerItemLink(bag, slot);
                        QuestItem_OpenLink(link);
                end
        end
        -- Execute base method
        if(executeBase) then
                base_ContainerFrameItemButton_OnClick(button, ignoreModifiers);
        end
end

function QuestItem_OpenLink(link)
        local name = QuestItem_nameFromLink(link);
        -- Open questlog for quest
        if(name) then
                if(QuestItems[name] and QuestItems[name].QuestName) then
                        QuestItem_OpenQuestLog(QuestItems[name].QuestName);
                        executeBase = false;
                end
        end
end

function QuestItem_BankFrameItemButtonGeneric_OnClick(button)
        local executeBase = true;
        if(QuestItem_Settings["AltOpen"] == true) then
                if(button == "RightButton" and not ignoreModifiers and IsAltKeyDown()) then
                        local link = GetContainerItemLink(BANK_CONTAINER, this:GetID());
                        QuestItem_OpenLink(link);
                        executeBase = false;
                end
        end
        if(executeBase) then
                base_BankFrameItemButtonGeneric_OnClick(button, ignoreModifiers);
        end
end

function QuestItem_BankFrameItemButtonBag_OnClick(button)
        --QuestItem_Debug(this:GetID());
end



----------------------------------------
-- [[ Set tooltip for linked items ]] --
----------------------------------------
function QuestItem_Chat_OnHyperlinkShow(reference, link, button)
        base_Chat_OnHyperlinkShow(reference, link, button);
        if(button == "LeftButton") then
                if (ItemRefTooltip:IsVisible()) then
                        local name = ItemRefTooltipTextLeft1:GetText();
                        if (name) then
                                local fabricatedLink = "|cff000000|H"..link.."|h["..name.."]|h|r";
                                
                                QuestItem_AddTooltip(ItemRefTooltip, name, fabricatedLink, -1, 1, 0);
                        end
                end
        end
end

function QuestItem_ContainerFrameItemButton_Update(frame)
        base_ContainerFrame_Update(frame);
end

----------------------------------
-- [[ QuestItem_NameFromLink ]] --
----------------------------------
function QuestItem_nameFromLink(link)
        local name;
        if( not link ) then
                return nil;
        end
        for name in string.gfind(link, "|c%x+|Hitem:%d+:%d+:%d+:%d+|h%[(.-)%]|h|r") do
                return name;
        end
        return nil;
end

---------------------------
-- [[ qualityFromLink ]] --
---------------------------
function QuestItem_qualityFromLink(link)
        local color;
        if (not link) then return nil; end
        for color in string.gfind(link, "|c(%x+)|Hitem:%d+:%d+:%d+:%d+|h%[.-%]|h|r") do
                if (color == "ffa335ee") then return 4;--[[ Epic ]] end
                if (color == "ff0070dd") then return 3;--[[ Rare ]] end
                if (color == "ff1eff00") then return 2;--[[ Uncommon ]] end
                if (color == "ffffffff") then return 1;--[[ Common ]] end
                if (color == "ff9d9d9d") then return 0;--[[ Poor ]] end
        end
        return -1;
end

Generated by GNU Enscript 1.6.5.90.