vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--============================================================================================--
--============================================================================================--
--                                                                                                                                                                                      --
--                                                        ITEM, BAG, TOOLTIP FUNCTIONS                                                            --
--                                                                                                                                                                                      --
--============================================================================================--
--============================================================================================--

--GetContainerItemLink item name strfind syntax
local WARDROBE_ITEM_NAME_FROM_LINK = "|h%[(.-)%]|h";
local WARDROBE_ITEM_UNIQUE_IDS_FROM_LINK = "|Hitem:(.-):(.-):(.-):(.-)|h%[(.-)%]|h"
--/script local itemNum=GetMouseFocus():GetID(); Sea.io.printComma(string.gfind(GetInventoryItemLink("player", itemNum), WARDROBE_ITEM_UNIQUE_IDS_FROM_LINK)())

local CraftableItemIDs = {
-- These item id's will ignore suffix
        [1254]  = true;         --Lesser Firestone
        [13699] = true;         --Firestone
        [13700] = true;         --Greater Firestone
        [13701] = true;         --Major Firestone
        
        [5522]  = true;         --Spellstone
        [13602] = true;         --Greater Spellstone
        [13603] = true;         --Major Spellstone
};

---------------------------------------------------------------------------------
-- Return the name of the item in the specified player's inventory slot number 
-- (1 = "headslot" etc - see Wardrobe.InventorySlots above for a full list of the slots)
---------------------------------------------------------------------------------
function Wardrobe.GetItemNameAtInventorySlotNumber(slotNum)

        local itemName, _ = "";
        -- get the id number for the item slot
        local id = GetInventorySlotInfo(Wardrobe.InventorySlots[slotNum]);
        local linktext = GetInventoryItemLink("player", id);
        if (linktext) then
                _,_,itemName = strfind(linktext, WARDROBE_ITEM_NAME_FROM_LINK);
        end
        return itemName;
end

function Wardrobe.GetItemInfoAtInventorySlotNumber(slotNum)

        local itemID, permEnchant, tempEnchant, suffix, itemName;
        -- get the id number for the item slot
        local linktext = GetInventoryItemLink("player", GetInventorySlotInfo(Wardrobe.InventorySlots[slotNum]));
        if (linktext) then
                itemID, permEnchant, tempEnchant, suffix, itemName = string.gfind(linktext, WARDROBE_ITEM_UNIQUE_IDS_FROM_LINK)();
        end
        return itemID, permEnchant, tempEnchant, suffix, itemName;
end


---------------------------------------------------------------------------------
-- Find the named item on the character's inventory (head slot, hand slot, etc -- not bags)
---------------------------------------------------------------------------------
function Wardrobe.FindInventoryItem(targetItemID, targetSuffix, targetPermEnchant, targetItemName)

        local itemSlot, itemID, permEnchant, tempEnchant, suffix, invItemName;
        for i = 1, table.getn(Wardrobe.InventorySlots) do
                itemID, permEnchant, tempEnchant, suffix, invItemName = Wardrobe.GetItemInfoAtInventorySlotNumber(i);
                
                if (itemID) then
                        if (targetItemID) and (targetSuffix) and (targetPermEnchant) then
                                -- If target item ID and suffix are passed try to match them.
                                if (targetItemID == itemID) and (targetSuffix == suffix) then
                                        if (targetPermEnchant == permEnchant) then
                                                itemSlot = i;
                                                break;
                                        else
                                                -- Perm enchant doesn't match, ignore
                                        end
                                end
                        elseif (targetItemName == invItemName) then
                                -- If only name is passed match loosely.
                                itemSlot = i;
                                break;
                        end
                end
        end
        
        return itemSlot;
end


---------------------------------------------------------------------------------
-- Return the name of the item in the specified bag and slot
---------------------------------------------------------------------------------
function Wardrobe.GetItemNameInBagSlot(bagNum, slotNum)
        
        local itemName, _ = "";
        local linktext = GetContainerItemLink(bagNum, slotNum)
        if (linktext) then
                _,_,itemName = strfind(linktext, WARDROBE_ITEM_NAME_FROM_LINK);
        end
        
        return itemName;
end

function Wardrobe.GetItemInfoInBagSlot(bagNum, slotNum)

        local itemID, permEnchant, tempEnchant, suffix, itemName;
        local linktext = GetContainerItemLink(bagNum, slotNum);
        if (linktext) then
                itemID, permEnchant, tempEnchant, suffix, itemName = string.gfind(linktext, WARDROBE_ITEM_UNIQUE_IDS_FROM_LINK)();
        end
        return itemID, permEnchant, tempEnchant, suffix, itemName;
end

---------------------------------------------------------------------------------
-- Given the name of an item, find the bag and slot the item is in
---------------------------------------------------------------------------------
function Wardrobe.FindContainerItem(targetItemID, targetSuffix, targetPermEnchant, targetItemName)
        local foundBag, foundSlot, wrongEnchant;
        --Wardrobe.Debug("      Looking in inventory for ["..targetItemName.."]");      
        
        -- for each bag and slot
        if ( Wardrobe.InventorySearchForward == 1 ) then
                bagcounterA = 0
                bagcounterB = NUM_CONTAINER_FRAMES
        else
                bagcounterB = 0
                bagcounterA = NUM_CONTAINER_FRAMES
        end
        
        local backupItems = {};
        local itemID, permEnchant, tempEnchant, suffix, bagItemName;
        
        for bag = bagcounterA, bagcounterB, Wardrobe.InventorySearchForward do
                local frame = getglobal("ContainerFrame"..bag);
                local counterA = 1
                local counterB = 1
        
                if ( Wardrobe.InventorySearchForward == 1 ) then
                        counterA = 1
                        counterB = GetContainerNumSlots(bag)
                else
                        counterB = 1
                        counterA = GetContainerNumSlots(bag)
                end
                
                for slot = counterA, counterB, Wardrobe.InventorySearchForward do
                        itemID, permEnchant, tempEnchant, suffix, bagItemName = Wardrobe.GetItemInfoInBagSlot(bag, slot);
                        Wardrobe.Debug("                 Comparing with "..tostring(bagItemName).." Bag:"..bag.." Slot:"..slot);
                        if (itemID) then
                                if (targetItemID) and (targetItemID == itemID) and CraftableItemIDs[targetItemID] then
                                        Wardrobe.Debug("                   FOUND [by craftable ID] in bag = "..bag.." slot = "..slot);
                                        foundBag  = bag;
                                        foundSlot = slot;
                                        break;
                                elseif (targetItemID) and (targetSuffix) and (targetPermEnchant) then
                                        -- If target item ID and suffix are passed try to match them.
                                        if (targetItemID == itemID) and (targetSuffix == suffix) then
                                                if (targetPermEnchant == permEnchant) then
                                                        Wardrobe.Debug("                   FOUND [by full ID] in bag = "..bag.." slot = "..slot);
                                                        foundBag  = bag;
                                                        foundSlot = slot;
                                                        break;
                                                else
                                                        -- Perm enchant doesn't match, add to backup list for 2nd pass
                                                        -- Currently Ignored for absolute match...
                                                        --table.insert(backupItems, {bag=bag,slot=slot});
                                                end
                                        end
                                elseif (targetItemName == bagItemName) then
                                        -- If only name is passed match loosely.
                                        Wardrobe.Debug("                   FOUND [by name] in bag = "..bag.." slot = "..slot);
                                        foundBag  = bag;
                                        foundSlot = slot;
                                        break;
                                end
                        end
                end
                if (foundBag and foundSlot) then
                        break;
                end
        end
        
        if (not foundBag and not foundSlot) then
                for index, info in backupItems do
                        -- Print out all found backups. Use the last one found.
                        foundBag  = info.bag;
                        foundSlot = info.slot;
                        wrongEnchant = true;
                        Wardrobe.Debug("                   FOUND [by partial ID] in bag = "..foundBag.." slot = "..foundSlot);
                end
        end

        if ( Wardrobe.InventorySearchForward == 1 ) then
                Wardrobe.InventorySearchForward = -1
        else
                Wardrobe.InventorySearchForward = 1
        end
        
        return foundBag, foundSlot, wrongEnchant;
end


---------------------------------------------------------------------------------
-- Build a list of items in our bags and on our person
---------------------------------------------------------------------------------
function Wardrobe.BuildItemList()

        tempList = {};
        
        -- for each bag and slot
        local itemID, permEnchant, tempEnchant, suffix, itemName
        for bag = 0, NUM_CONTAINER_FRAMES, 1 do
                local frame = getglobal("ContainerFrame"..bag);
                for slot = 1, GetContainerNumSlots(bag) do
                
                        -- get the name of the item in this bag/slot
                        --itemName = Wardrobe.GetItemNameInBagSlot(bag, slot);
                        itemID, permEnchant, tempEnchant, suffix, itemName = Wardrobe.GetItemInfoInBagSlot(bag, slot);
                        if (itemName) and (itemName ~= "") then
                                table.insert(tempList, {Name = itemName, ItemID = itemID, PermEnchant = permEnchant, TempEnchant = tempEnchant, Suffix = suffix});
                        end
                end
        end

        -- for each inventory item
        for i = 1, table.getn(Wardrobe.InventorySlots) do   
                --itemName = Wardrobe.GetItemNameAtInventorySlotNumber(i);
                itemID, permEnchant, tempEnchant, suffix, itemName = Wardrobe.GetItemInfoAtInventorySlotNumber(i);
                if (itemName) and (itemName ~= "") then
                        table.insert(tempList, {Name = itemName, ItemID = itemID, PermEnchant = permEnchant, TempEnchant = tempEnchant, Suffix = suffix});                
                end
        end

        
        return tempList;        
end



---------------------------------------------------------------------------------
-- Equip the specified item into the specified slot on our character (hands, chest, etc)
---------------------------------------------------------------------------------
function Wardrobe.Equip(itemName, equipSlot, itemID, suffix, permEnchant)

        -- if we're already holding something, bail
        if (CursorHasItem()) then
                return false;
        end
        
        -- find the bag and slot of this item
        local bag, slot, wrongEnchant = Wardrobe.FindContainerItem(itemID, suffix, permEnchant, itemName);
        if (bag and slot) then
                PickupContainerItem(bag, slot);
                if (equipSlot) and (equipSlot >= 11) and (equipSlot <= 17) and (equipSlot ~= 15) then
                        --Fingers, Trinkets, Weapons
                        --PickupInventoryItem(equipSlot);
                        EquipCursorItem(equipSlot);
                else
                        AutoEquipCursorItem();
                end
                return true;
        elseif (equipSlot) and (equipSlot >= 11) and (equipSlot <= 17) and (equipSlot ~= 15) then
                -- Fingers, Trinkets, Weapons
                -- Find the inventory slot of this item
                local invSlot = Wardrobe.FindInventoryItem(itemID, suffix, permEnchant, itemName);
                if (invSlot) then
                        --convert to inventory id
                        invSlot = GetInventorySlotInfo(Wardrobe.InventorySlots[invSlot]);
                        
                        if (invSlot ~= equipSlot) then
                                PickupInventoryItem(invSlot);
                                EquipCursorItem(equipSlot);
                                return true;
                        end
                end
        end
        return false;
end


---------------------------------------------------------------------------------
-- Check to see if the specified outfit name is already being used
---------------------------------------------------------------------------------
function Wardrobe.FoundOutfitName(outfitName)
        
        for i, outfit in Wardrobe_Config[WD_realmID][WD_charID].Outfit do
                if (outfit.OutfitName == outfitName) then
                        return true;
                end
        end
        
        return false;
end


---------------------------------------------------------------------------------
-- Return the index of the specified outfitName
---------------------------------------------------------------------------------
function Wardrobe.GetOutfitNum(outfitName)
        
        for i, outfit in Wardrobe_Config[WD_realmID][WD_charID].Outfit do
                if (outfit.OutfitName == outfitName) then
                        return i;
                end
        end
end



---------------------------------------------------------------------------------
-- See if this bag / slot is being used or is free
---------------------------------------------------------------------------------
function Wardrobe.UsedThisSlot(freeBagSpacesUsed, theBag, theSlot)
        for i = 1, table.getn(freeBagSpacesUsed) do
                if (freeBagSpacesUsed[i][1] == theBag and freeBagSpacesUsed[i][2] == theSlot) then
                        return true;
                end
        end
        return false;
end


---------------------------------------------------------------------------------
-- Put an item into a free bag slot
---------------------------------------------------------------------------------
function BagItem(freeBagSpacesUsed, backwards)
        if (not freeBagSpacesUsed) then
                freeBagSpacesUsed = {};
        end
        local firstBag, lastBag, inc;
        if (backwards) then
                firstBag = 4
                lastBag = 1;
                inc = -1;
        else
                firstBag = 0
                lastBag = 4;
                inc = 1;
        end
        -- for each bag and slot
        for theBag = firstBag, lastBag, inc do
                local numSlot = GetContainerNumSlots(theBag);
                for theSlot = 1, numSlot do
                
                        -- get info about the item here
                        local texture, itemCount, locked = GetContainerItemInfo(theBag, theSlot);
                        
                        -- if we found nothing, add us to the list of free bag slots
                        if (not texture and not Wardrobe.UsedThisSlot(freeBagSpacesUsed, theBag, theSlot)) then
                                PickupContainerItem(theBag,theSlot);
                                table.insert(freeBagSpacesUsed, {theBag, theSlot});
                                return true, freeBagSpacesUsed;
                        end
                end
        end
        
        AutoEquipCursorItem();
        
        return false, freeBagSpacesUsed;
end

---------------------------------------------------------------------------------
-- Move an item in your bags to the back most free bag slot
---------------------------------------------------------------------------------
function ReBagContainerItem(invItemName)
        local foundBag, foundSlot, wrongEnchant = Wardrobe.FindContainerItem(nil, nil, nil, invItemName);
        PickupContainerItem(foundBag, foundSlot);
        BagItem(nil,true);
end