vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
--
--      Sea.wow.item
--
--      Item related wow functions
--
--      $LastChangedBy: Sinaloit $
--      $Rev: 2025 $
--      $Date: 2005-07-02 18:51:34 -0500 (Sat, 02 Jul 2005) $
--]]

Sea.wow.item = {

        --
        -- getInventoryItemName( bag, slot )
        --
        --      Gets the name of the item in the specified bag/slot
        --
        -- Args:
        --      (int bag, int slot)
        --      bag - 0 through 8, the bag number
        --      slot - index within the bag
        --      
        -- Returns:
        --      (string name)
        --      name - the item's name
        --      
        getInventoryItemName = function (bag, slot)
                local name = "";
                local strings = nil;
                strings = Sea.wow.item.getInventoryItemInfoStrings(bag, slot, "GameTooltip");
                -- Determine if the item is an ore, gem or herb
                if ( strings[1] ) then
                        name = strings[1].left;
                end
                return name;
        end;
        
        --
        -- classifyInventoryItem(bag, slot, TooltipNameBase)
        --
        --      Returns a great deal of useful information about an item.
        --
        -- Return:
        --      Table[
        --              .classification
        --              .name
        --              .quality
        --              .count
        --              .minLevel
        --              .unique
        --              .soulbound
        --              .bindOnPickup
        --              .bindOnEquip
        --              .quest
        --              ] itemInfo;
        --
        --

        classifyInventoryItem = function (bag, slot, TooltipNameBase)
                if ( TooltipNameBase == nil ) then 
                        TooltipNameBase = "GameTooltip";
                end
        
                local strings = Sea.wow.item.getInventoryItemInfoStrings(bag, slot, TooltipNameBase);
        
                local texture, itemCount, locked, quality = GetContainerItemInfo(bag,slot);

                return Sea.wow.item.classifyItemStrings(strings, itemCount, quality);
        end;
        
        
        --
        -- classifyItemStrings(strings, itemCount, quality)
        --
        --  Args:
        --
        --   strings - array of strings that mimic the tooltip of the item to classify
        --   itemCount - optional number that indicates the number of items
        --   quality - optional number that indicates the quality of the item
        --
        --      Returns a great deal of useful information about an item. 
        --  The tooltip strings must be gathered from the item, using the 
        --   getInventoryItemInfoStrings syntax.
        --
        --
        -- Return:
        --      Table[
        --              .classification
        --              .name
        --              .quality
        --              .count
        --              .minLevel
        --              .unique
        --              .soulbound
        --              .bindOnPickup
        --              .bindOnEquip
        --              .quest
        --              ] itemInfo;
        --
        --
        classifyItemStrings = function (strings, itemCount, quality)
                if ( not itemCount ) then
                        itemCount = 1;
                end
                local classification = "Misc";
                local leftString, rightString, minLevel;
                local unique = false;
                local soulbound = false;
                local bindsOnPickup = false;
                local bindsOnEquip = false;
                local questItem = false;
                local isHerb = false;
                local isGem = false;
                local isOre = false;
                local isLeather = false;
                local isTailor = false;
                local isFishing = false;
                local isFood = false;
                local isDrink = false;
                local isShaman = false;
                local isPoison = false;
                local isWarlock = false;
                local isJunk = false;
                local engineering = false;
                local firstaid = false;
                local classitem = false;
                local class = "";
                local name = "";
                -- Look for the target line that identifies an item; it'll either be line 2, 3, or 4.

                -- Determine if the item is an ore, gem or herb
                if ( strings[1] ) then
                        name = strings[1].left;
                end
        
                isHerb = Sea.list.isWordInList(Sea.data.item.herb, name);
                isGem  = Sea.list.isWordInList(Sea.data.item.gem, name);
                isOre  = Sea.list.isWordInList(Sea.data.item.ore, name);
                isLeather = Sea.list.isWordInList(Sea.data.item.leather, name);
                isFishing = Sea.list.isWordInList(Sea.data.item.fishing, name);
                isTailor = Sea.list.isWordInList(Sea.data.item.cloth, name);
                isPotion = Sea.list.isWordInList(Sea.data.item.potion, name);
                isMage = Sea.list.isWordInList(Sea.data.item.mage, name);
                isFood = Sea.list.isWordInList(Sea.data.item.food, name);
                isDrink = Sea.list.isWordInList(Sea.data.item.drink, name);
                isShaman = Sea.list.isWordInList(Sea.data.item.shaman, name);
                isPoison = Sea.list.isWordInList(Sea.data.item.poison, name);
                isWarlock = Sea.list.isWordInList(Sea.data.item.warlock, name);

                if ( ( quality ) and ( quality < 0 ) ) then 
                        isJunk = true;
                end

                for i = 2, 5, 1 do
                        if (not strings[i])
                                then
                                break;
                        end
                        if (strings[i].left == ITEM_UNIQUE or strings[i].left == ITEM_UNIQUE_MULTIPLE ) then unique = true; end
                        if (strings[i].left == ITEM_SOULBOUND ) then soulbound = true; end
                        if (strings[i].left == ITEM_BIND_ON_PICKUP ) then bindsOnPickup = true; end
                        if (strings[i].left == ITEM_BIND_ON_EQUIP ) then bindsOnEquip = true; end
                        if (strings[i].left == ITEM_BIND_QUEST ) then questItem = true; end
                        
                        if (string.find(strings[i].left,"First Aid", 0, true ) ) then firstaid = true; end
                        if (string.find(strings[i].left,"Engineering", 0, true ) ) then engineering = true; end
                        if (string.find(strings[i].left,"Classes:", 0, true ) ) then classitem = true; class = string.sub(strings[i].left, string.find(strings[i].left,":", 0, true )+2); end
                        
                        if (strings[i].left and
                                strings[i].left ~= ITEM_UNIQUE and
                                strings[i].left ~= ITEM_SOULBOUND and
                                strings[i].left ~= ITEM_BIND_ON_EQUIP and
                                strings[i].left ~= ITEM_BIND_ON_PICKUP and
                                strings[i].left ~= ITEM_BIND_QUEST)
                                then
                                leftString = strings[i].left;
                                rightString = strings[i].right;
                                break;
                        end
                end
                
                -- Find last line
                local lastLine;
                for i = 1, 10, 1 do
                        if (strings[i] and strings[i].left)
                                then
                                lastLine = strings[i].left;
                        else
                                break;
                        end
                end
                
                -- look at last line to see if it's a level requirement
                local minLevel = 0;
                if (lastLine)
                        then
                        local index, length, levelString = string.find(lastLine, "^Requires Level (%d+)$");
                        if (index) then
                                minLevel = Sea.string.toInt(levelString);
                        end
                end
        
                -- classify item based on found strings
                if (leftString)
                then
                        if (leftString == "Main Hand" or
                                leftString == "Two-Hand" or
                                leftString == "One-Hand")
                        then
                                classification = "Weapon";
                        elseif (leftString == "Head" or
                                leftString == "Hand" or
                                leftString == "Waist" or
                                leftString == "Shoulders" or
                                leftString == "Legs" or
                                leftString == "Back" or
                                leftString == "Feet" or
                                leftString == "Chest" or
                                leftString == "Wrist")
                                then
                                classification = "Armor";
                        elseif (leftString == "Off Hand")
                                then
                                classification = "Shield";
                        elseif (leftString == "Wand" or
                                leftString == "Ranged" or
                                leftString == "Gun" )
                                then
                                classification = "Ranged";
                        elseif (leftString == "Projectile") 
                                then
                                classification = "Ammo";
                        elseif (leftString == "Shirt" or
                                leftString == "Tabard" or
                                leftString == "Finger" or
                                leftString == "Neck" or
                                leftString == "Trinket" or
                                leftString == "Held In Hand")
                                then
                                classification = "Clothing";
                        end
                end
                if ( classification == "Misc" ) then
                        if ( isJunk ) then classification = "Junk"; end
                        if ( isGem ) then classification = "Gem"; end
                        if ( isOre ) then classification = "Ore"; end
                        if ( isHerb ) then classification = "Herb"; end
                        if ( engineering ) then classification = "Engineering"; end
                        if ( firstaid ) then classification = "First Aid"; end
                        if ( isLeather ) then classification = "Leather"; end
                        if ( isTailor ) then classification = "Thread"; end
                        if ( isPotion ) then classification = "Potion"; end
                        if ( isFishing ) then classification = "Fishing"; end
                        if ( isFood ) then classification = "Food"; end
                        if ( isDrink ) then classification = "Drink"; end
                        if ( isMage ) then classification = "Mage"; end
                        if ( isShaman ) then classification = "Shaman"; end
                        if ( isWarlock ) then classification = "Warlock"; end
                        if ( isPoison ) then classification = "Poison"; end
                        if ( classitem ) then classification = class; end
                        if ( questItem ) then classification = "QuestItem"; end
                end 
                
                -- Create the item table
                -- Will soon have item information
                itemInfo = {};
                itemInfo.classification = classification;
                itemInfo.name = name;
                itemInfo.quality = quality;
                itemInfo.count = itemCount;
                itemInfo.minLevel = minLevel;
                itemInfo.unique = unique;
                itemInfo.soulbound = soulbound;
                itemInfo.bindOnPickup = bindsOnPickup;
                itemInfo.bindOnEquip = bindsOnEquip;
                itemInfo.quest = questItem;
        
                return itemInfo;
        end;
        
        --
        -- getInventoryItemInfoStrings ( bag, slot [, tooltip] )
        --
        --    Obtains all information about a bag/slot and returns it as an array       
        --
        -- Args:
        --      (int bag, int slot, string tooltipbase )
        --
        -- Returns:
        --      (table[row][.left .right] strings)
        --      string - the string data of the tooltip
        -- 
        getInventoryItemInfoStrings = function (bag,slot, TooltipNameBase)
                if ( TooltipNameBase == nil ) then 
                        TooltipNameBase = "GameTooltip";
                end

                Sea.wow.tooltip.clear(TooltipNameBase);
        
                local tooltip = getglobal(TooltipNameBase);
                
                -- Open tooltip & read contents
                Sea.wow.tooltip.protectTooltipMoney();
                if ( bag > -1 ) then
                        tooltip:SetBagItem( bag, slot );
                else
                        tooltip:SetInventoryItem( "player", slot);
                end
                Sea.wow.tooltip.unprotectTooltipMoney();
                local strings = Sea.wow.tooltip.scan(TooltipNameBase);

                -- Done our duty, send report
                return strings;
        end;

};