vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        Tradeskill support
        Gives you quantities based upon your tradeskilling abilities.
        $Id: InfTrades.lua 716 2006-02-09 15:25:17Z mentalpower $
        Version 3.8.0 (Kangaroo)

        License:
                This program is free software; you can redistribute it and/or
                modify it under the terms of the GNU General Public License
                as published by the Free Software Foundation; either version 2
                of the License, or (at your option) any later version.

                This program is distributed in the hope that it will be useful,
                but WITHOUT ANY WARRANTY; without even the implied warranty of
                MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                GNU General Public License for more details.

                You should have received a copy of the GNU General Public License
                along with this program(see GLP.txt); if not, write to the Free Software
                Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
--]]

local p = EnhancedTooltip.DebugPrint;

local tsfHookOnUpdate, tsfHookSetSelection, scanTradeskillLink, tradeSkillText
local readFormula, getCounts, scanBank, scanBags, scanContainer, getPlayerName
local initTrades

-- Hooked functions

function tradeHook(type, selID)
        p("Processing trade", trade, selID);
        if (selID == nil) then
                -- We are hooked into the tradeskill frame and it has been updated
                for i=1, TRADE_SKILLS_DISPLAYED, 1 do
                        local button = getglobal("TradeSkillSkill"..i)
                        local skillIndex = button:GetID()
                        local skillName, skillType, numAvailable, isExpanded = GetTradeSkillInfo(skillIndex);
                        button:SetText(tradeSkillText(skillIndex, skillName))
                        scanTradeskillID(i, false)
                end
        else
                scanTradeskillLink(selID, true)
        end
end

function bankHook()
        p("Processing bank contents");
        scanContainer(BANK_CONTAINER)
        for bag = 5, 10 do
                scanContainer(bag)
        end
end

function bagHook()
        p("Processing bag contents");
        for bag = 0, 4 do
                scanContainer(bag)
        end
end

function initTrades()
        Stubby.RegisterFunctionHook("EnhTooltip.TradeHook", 100, tradeHook);
        Stubby.RegisterFunctionHook("EnhTooltip.BankHook", 100, bankHook);
        Stubby.RegisterFunctionHook("EnhTooltip.BagHook", 100, bagHook);
        Informant.InitTrades = function() end
end
Informant.InitTrades = initTrades

-- Associated functions

function scanTradeskillLink(id, setStrings)
        -- We are hooked into the tradeskill frame and it has been updated
        local skillName, skillType, numAvailable, isExpanded = GetTradeSkillInfo(id)
        local skillLink = GetTradeSkillItemLink(id)
        local skillID = EnhancedTooltip.baselinkFromLink(skillLink)

        if (setStrings) then
                local totalSkillItems = getTotalCount(skillID)
                if (totalSkillItems > 0) then
                        local invSkillItems = getInventoryCount(skillID)
                        TradeSkillSkillName:SetText(skillName.." ["..invSkillItems.."/"..totalSkillItems.."]")
                else
                        TradeSkillSkillName:SetText(skillName)
                end
        end

        local formula = "";
        local numReagents = GetTradeSkillNumReagents(id)
        for i=1, numReagents, 1 do
                local reagentName, reagentTexture, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(id, i)
                local reagentLink = GetTradeSkillReagentLink(id, i);
                local reagentID = EnhancedTooltip.baselinkFromLink(reagentLink);
                local totalReagents = getTotalCount(reagentName)
                formula = formula..":"..reagentID.."x"..reagentCount
                if (setStrings) then
                        getglobal("TradeSkillReagent"..i.."Name"):SetText(reagentName.." ["..totalReagents.."]")
                end
        end
        Informant_Formulae[skillID] = formula;
end


function scanContainer(bag)
        local texture, itemCount, itemLink
        local itemID, randomProperty, enchantment, uniqueID, itemName
        local containerItems = GetContainerNumSlots(bag)
        if (containerItems) then
                for containerItemNum = 1, containerItems do
                        itemLink = GetContainerItemLink(bag, containerItemNum)
                        if (itemLink) then
                                texture, itemCount = GetContainerItemInfo(bag, containerItemNum)
                                itemID, randomProperty, enchantment, uniqueID, itemName = EnhTooltip.BreakLink(itemLink)

                                if ((bag == BANK_CONTAINER) or ((bag >= 5) and (bag <= 10))) then
                                end
                        end
                end
        end
end


-- Utility functions

-- Get the current realm and player
local playerRealm = nil
local playerName = nil
function getPlayerName()
        if (playerName == nil) then
                playerRealm = GetCVar("realmName")
                playerName = UnitName("player")
        end
        return playerRealm, playerName;
end

-- Read (and extrapolate) a formula and work out how many we can make
function readFormula(itemKey)
        local formula = Informant_Formulae[itemKey]
        local bag, bank, other, make, vend, all
        local tBag, tBank, tOther, tMake, tVend, tAll
        for reagKey, reagCount in string.gfind(formula, ":(%d+)x(%d+)") do
                local _,_, reagID = string.find(reagKey, "(\d+):");
                bag, bank, other = getCounts(reagKey)
                if (InformantFormula[reagKey]) then
                        local subMake = readFormula(reagKey)
                        make = subMake.all
                end
                vend = 0;
                local reagData = Informant.getItem(reagID);
                if (reagData.quantity > 0) then
                        vend = 9999;
                end
                all = math.max(9999, bag + bank + other + vend + make);

                tBag = math.min(tBag, math.floor(bag / reagCount))
                tBank = math.min(tBank, math.floor(bank / reagCount))
                tOther = math.min(tOther, math.floor(other / reagCount))
                tMake = math.min(tMake, math.floor(make / reagCount))
                tAll = math.min(tAll, math.floor(all / reagCount))
        end

        return {
                bag = tBag,
                bank = tBank,
                other = tOther,
                make = tMake,
                all = tAll,
        }
end

-- How many of these do I have?
function getCounts(itemID)
        local curRealm, curPlayer = getPlayerName()
        local invTotal = 0
        local bankTotal = 0
        local otherTotal = 0
        if (InformantItems and InformatItems[curRealm]) then
                for player, pData in Informant_Items[curRealm] do
                        local i,j, invCount, bankCount = string.find(pData, "(%d):(%d)");
                        if (player == curPlayer) then
                                invTotal = tonumber(invCount)
                                bankTotal = tonumber(bankCount)
                        else
                                otherTotal = tonumber(invCount) + tonumber(bankCount)
                        end
                end
        end
        return invTotal, bankTotal, otherTotal;
end