vanilla-wow-addons – Rev 1
?pathlinks?
local vmajor, vminor = "1", tonumber(string.sub("$Revision: 666 $", 12, -3))
local stubvarname = "TekLibStub"
local libvarname = "PTTradeskillsEmbed"
-- Check to see if an update is needed
-- if not then just return out now before we do anything
local libobj = getglobal(libvarname)
if libobj and not libobj:NeedsUpgraded(vmajor, vminor) then return end
local stubobj = getglobal(stubvarname)
if not stubobj then
stubobj = {}
setglobal(stubvarname, stubobj)
-- Instance replacement method, replace contents of old with that of new
function stubobj:ReplaceInstance(old, new)
for k,v in pairs(old) do old[k]=nil end
for k,v in pairs(new) do old[k]=v end
end
-- Get a new copy of the stub
function stubobj:NewStub(name)
local newStub = {}
self:ReplaceInstance(newStub, self)
newStub.libName = name
newStub.lastVersion = ''
newStub.versions = {}
return newStub
end
-- Get instance version
function stubobj:NeedsUpgraded(vmajor, vminor)
local versionData = self.versions[vmajor]
if not versionData or versionData.minor < vminor then return true end
end
-- Get instance version
function stubobj:GetInstance(version)
if not version then version = self.lastVersion end
local versionData = self.versions[version]
if not versionData then print(string.format("<%s> Cannot find library version: %s", self.libName, version or "")) return end
return versionData.instance
end
-- Register new instance
function stubobj:Register(newInstance)
local version,minor = newInstance:GetLibraryVersion()
self.lastVersion = version
local versionData = self.versions[version]
if not versionData then
-- This one is new!
versionData = {
instance = newInstance,
minor = minor,
old = {},
}
self.versions[version] = versionData
newInstance:LibActivate(self)
return newInstance
end
-- This is an update
local oldInstance = versionData.instance
local oldList = versionData.old
versionData.instance = newInstance
versionData.minor = minor
local skipCopy = newInstance:LibActivate(self, oldInstance, oldList)
table.insert(oldList, oldInstance)
if not skipCopy then
for i, old in ipairs(oldList) do self:ReplaceInstance(old, newInstance) end
end
return newInstance
end
end
if not libobj then
libobj = stubobj:NewStub(libvarname)
setglobal(libvarname, libobj)
end
local lib = {}
-- Return the library's current version
function lib:GetLibraryVersion()
return vmajor, vminor
end
-- Activate a new instance of this library
function lib:LibActivate(stub, oldLib, oldList)
local maj, min = self:GetLibraryVersion()
if oldLib then
local omaj, omin = oldLib:GetLibraryVersion()
self.compost = oldLib.compost or CompostLib and CompostLib:GetInstance("compost-1")
self.quals, self.tradedata, self.eventframe = oldLib.quals, oldLib.tradedata, oldLib.eventframe
else
self.compost = CompostLib and CompostLib:GetInstance("compost-1")
self.quals = {trivial = 0, easy = 1, medium = 2, optimal = 3, difficult = 4}
self.tradedata = {}
self.eventframe = CreateFrame("Frame")
self.eventframe.master = self
self.eventframe:SetScript("OnEvent", function() this.master[event](this.master) end)
self.eventframe:RegisterEvent("CRAFT_SHOW")
self.eventframe:RegisterEvent("TRADE_SKILL_SHOW")
end
-- nil return makes stub do object copy
end
------------------------------
-- Lookup methods --
------------------------------
-- Returns a table of recepies this item is used in, or nil if no known use
-- Return table elements are as follows:
-- [recepieid] = {recepiename, skilllevel, numberneeded}
-- recepieid == an itemid for the product (or an enchantid if the recepie is an enchant)
-- recepiename == name of the item made
-- skilllevel == relative difficulty of the recepie
-- numberneeded == number of the ingred item called for in the recepie
function lib:GetRecepieUse(itemid)
if type(itemid) == "string" then
_, _, id = string.find(itemid, "item:(%d+):%d+:%d+:%d+")
if id then itemid = tonumber(id)
else return end
end
if type(itemid) ~= "number" then return end
local retval
for trade,data in self.tradedata do
for recid,recdata in data do
for id,num in recdata.ing do
if id == itemid then
if not retval then retval = self.compost and self.compost:Acquire() or {} end
local name = recdata.name or GetItemInfo(recid)
retval[recid] = self.compost and self.compost:Acquire(name, recdata.skill, num) or {name, recdata.skill, num}
end
end
end
end
return retval
end
-- returns true if the tradeskill passed uses the itemid, nil otherwise
function lib:TradeUsesItem(trade, itemid)
if not self.tradedata[trade] then return end
for recid,recdata in self.tradedata[trade] do
for id,num in recdata.ing do
if id == itemid then return true end
end
end
end
-- Returns a list of tradeskills the player know which can use the itemid, or nil if none
function lib:TradesUseItem(itemid)
local retval
for trade,data in self.tradedata do
if self:TradeUsesItem(trade, itemid) then
if not retval then retval = self.compost and self.compost:Acquire() or {} end
table.insert(retval, trade)
end
end
return retval
end
----------------------------------
-- Tradeskill parsing --
----------------------------------
function lib:TRADE_SKILL_SHOW()
local trade = GetTradeSkillLine()
if not self.tradedata[trade] then self.tradedata[trade] = {} end
for i=1,GetNumTradeSkills() do
local _, t = GetTradeSkillInfo(i)
if (t ~= "header") then
local link = GetTradeSkillItemLink(i)
if link then
local _, _, id = string.find(link, "item:(%d+):%d+:%d+:%d+")
self.tradedata[trade][tonumber(id)] = self.tradedata[trade][tonumber(id)] or {ing = self:ParseTradeskillItem(i), skill = self.quals[t]}
end
end
end
end
function lib:ParseTradeskillItem(tidx)
local retval = {}
for i=1,GetTradeSkillNumReagents(tidx) do
local _, _, num = GetTradeSkillReagentInfo(tidx, i)
local link = GetTradeSkillReagentItemLink(tidx, i)
if link then
local _, _, id = string.find(link, "item:(%d+):%d+:%d+:%d+")
retval[tonumber(id)] = num
end
end
return retval
end
-----------------------------
-- Craft parsing --
-----------------------------
-- Craft == enchanting, tradeskill == everything else
function lib:CRAFT_SHOW()
local trade = GetCraftName()
if not self.tradedata[trade] then self.tradedata[trade] = {} end
for i=1,GetNumCrafts() do
local name, _, t = GetCraftInfo(i)
if (t ~= "header") then
local link = GetCraftItemLink(i)
if link then
local _, _, id = string.find(link, "enchant:(%d+)")
self.tradedata[trade][tonumber(id)] = self.tradedata[trade][tonumber(id)] or {ing = self:ParseCraftItem(i), skill = self.quals[t], name = name}
end
end
end
end
function lib:ParseCraftItem(idx)
local retval = {}
for i=1,GetCraftNumReagents(idx) do
local _, _, num = GetCraftReagentInfo(idx, i)
local link = GetCraftReagentItemLink(idx, i)
if link then
local _, _, id = string.find(link, "item:(%d+):%d+:%d+:%d+")
retval[tonumber(id)] = num
end
end
return retval
end
--------------------------------
-- Load this bitch! --
--------------------------------
libobj:Register(lib)