vanilla-wow-addons – Rev 1
?pathlinks?
--============================================================================================--
--============================================================================================--
-- --
-- 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