-- $Revision: 206 $ -- Cauldron utility functions local L = LibStub("AceLocale-3.0"):GetLocale("Cauldron") function Cauldron:IsVendorItem(item) if (not item) or (type(item) ~= "number") then return false; end for _,num in ipairs(Cauldron.vars.vendoritems) do if num == item then return true; end end self:debug("not found"); return false; end function Cauldron:GetAltReagentCount(reagentInfo) self:debug("GetAltReagentCount enter"); -- TODO self:debug("GetAltReagentCount exit"); end function Cauldron:GetPotentialCraftCount(skillInfo) self:debug("GetPotentialCraftCount enter"); local count = 0; -- a place to store count values local c = {}; -- iterate over the reagent list and find out how many can be made for each reagent count; -- the lowest value is the potential amount craftable; only count a skill if it has more -- than one reagent, and is a key reagent if #skillInfo.reagents > 1 then for i,rinfo in ipairs(skillInfo.reagents) do -- only count "key" reagents if rinfo.key then local counts = Cauldron:ReagentCount(rinfo.name); local makeable = math.floor(counts.has / rinfo.numRequired); table.insert(c, makeable); --[[ if (makeable > 0) and (count > 0) and (makeable < count) then count = makeable; end --]] end end -- sort the table table.sort(c); -- if there are any results, get the first, because it will be the lowest number if #c > 0 then count = c[1]; end end --[[ if count == 999999 then count = 0; end --]] self:debug("GetPotentialCraftCount exit"); return count; end function Cauldron:ReagentCount(reagent) local count = { has = 0, bank = 0, guildBank = 0, mail = 0, altHas = {}, total = 0, }; -- sanity checks if not reagent then self:debug("No reagent specified for count!"); return count; end count.has = GetItemCount(reagent, false); count.bank = GetItemCount(reagent, true) - count.has; -- total up count.total = count.has + count.bank + count.guildBank + count.mail; --[[ for alt,altCount in pairs(count.altHas) do count.total = count.total + altCount; end --]] return count; end function Cauldron:SkillContainsText(recipe, text) -- sanity checks if (not recipe) or (not text) then -- TODO: display error return false; end if string.find(recipe.name, text) then return true; end for i, reagent in ipairs(recipe.reagents) do if string.find(reagent.name, text) then return true; end end -- TODO: check flavor text? return false; end function Cauldron:GetIdFromLink(link) if not link then return end -- local _,_,id,name = strfind(link,"|Hitem:(%d+):.+%[(.+)%]"); local _,_,id = strfind(link,"item:(%d+):"); if not id then -- local _,_,id,name = strfind(link,"|Henchant:(%d+)|h%[(.+)%]"); local _,_,id = strfind(link,"enchant:(%d+)"); if id then return tonumber(id) end else return tonumber(id); end end function Cauldron:GetNameFromLink(link) if not link then return end local _,_,name = strfind(link,"|Hitem:.+%[(.+)%]"); if not name then _,_,name = strfind(link,"|Henchant:.+%[(.+)%]"); end return name; end function Cauldron:GetSpellNameFromLink(link) if not link then return end local _,_,name = strfind(link,"|Henchant:.+%[.+: (.+)%]"); return name; end function Cauldron:ScanBags() -- reset inventory self.vars.inventory = {}; -- process keyring and inventory bags for _,bagid in ipairs({-2,0,1,2,3,4}) do -- iterate over bag for i=1,GetContainerNumSlots(bagid) do local link = GetContainerItemLink(bagid, i); if link then local name = Cauldron:GetNameFromLink(link); if name then local count = GetItemCount(link); self.vars.inventory[name] = count; end end end end end function Cauldron:GetItemDeltas(bagid) -- sanity checks if not bagid then self:error("No bag ID specified!"); return {}; end local deltas = {}; if not self.vars.inventory then self.vars.inventory = {}; end local inv = self.vars.inventory; for i=1,GetContainerNumSlots(bagid) do local link = GetContainerItemLink(bagid, i); if link then local name = Cauldron:GetNameFromLink(link); if name then local count = GetItemCount(link); -- local count = select(2, {GetContainerItemInfo(bagid, i)}); local delta = count; if inv[name] then delta = count - inv[name]; end if delta ~= 0 then -- save the delta information deltas[name] = delta; end end end end return deltas; end function Cauldron:GetMerchantItems() local items = {}; for i=1,GetMerchantNumItems() do local name, _, price, quantity, avail, _, extCost = GetMerchantItemInfo(i); -- Cauldron:info("MERCHANT: item="..name.."; price="..tostring(price).."; quantity="..tostring(quantity).."; avail="..tostring(avail).."; extCost="..tostring(extCost)); local maxStack = GetMerchantItemMaxStack(i); if (avail ~= 0) and name then items[name] = { ['index'] = i, ['price'] = price, ['quantity'] = quantity, ['available'] = avail, ['maxStack'] = maxStack, }; end end return items; end function Cauldron:SortTableIndices(t) if not t then return {}; end local a = {}; for n in pairs(t) do a[#a + 1] = n; end table.sort(a); return a; end function Cauldron:CreateAchievementSkillMap() Cauldron.vars.achievementMap = {}; --[[ -- TODO: get all achievement categories that have 169 (Professions) as parent -- currently: 171 (Fishing), 170 (Cooking), 172 (First Aid) local categories = { 170, 171, 172 }; for _,categoryID in ipairs(categories) do -- get the number of achievements in this category local numAchievements = GetCategoryNumAchievements(categoryID); for i=1,numAchievements do -- get the achievements in the category local achievementID,_,_,achievementCompleted,_,_,_,_,_,_,_ = GetAchievementInfo(categoryID, i); if not achievementCompleted then local numCriteria = GetAchievementNumCriteria(achievementID); for j=1,numCriteria do -- get the criteria of the achievement local criteriaString,criteriaType,criteriaCompleted,_,_,_,_,assetID,_,criteriaID = GetAchievementCriteriaInfo(achievementID, j); -- check if the achievement has been completed if not criteriaCompleted then -- check if the criteria is the right type if criteriaType == 29 or criteriaType == 112 then if not Cauldron.vars.achievementMap[criteriaString] then Cauldron.vars.achievementMap[criteriaString] = {}; end table.insert(Cauldron.vars.achievementMap[criteriaString], achievementID); end end end end end end --]] end function Cauldron:GetAchievementsForSkill(skillInfo) if not skillInfo then return nil; end return Cauldron.vars.achievementMap[skillInfo.name]; end function Cauldron:GetAutoBuy() return Cauldron.db.realm.userdata[Cauldron.vars.playername].options.autoBuy; end function Cauldron:MarkRecipeForRescan(skillDB, name) if not skillDB then return; end -- store rescan info if not skillDB.rescan then skillDB.rescan = { failedRecipes = {}, }; end -- record the failed recipe skillDB.rescan.failedRecipes[name] = true; end function Cauldron:JoinStrings(strings, sep) local joinedStr = ""; for i,str in ipairs(strings) do if i > 1 then joinedStr = joinedStr..sep; end joinedStr = joinedStr..str; end return joinedStr; end