Mercurial > wow > reagentmaker
changeset 25:578b9c9479c9
Remove errors for hidden recipes and show a '?' when count isn't available
author | contrebasse |
---|---|
date | Thu, 28 Apr 2011 19:31:01 +0200 |
parents | 5f3a5b88fb19 |
children | 886be292feec |
files | ReagentMaker.lua utils.lua |
diffstat | 2 files changed, 278 insertions(+), 255 deletions(-) [+] |
line wrap: on
line diff
--- a/ReagentMaker.lua Wed Apr 27 23:46:20 2011 +0200 +++ b/ReagentMaker.lua Thu Apr 28 19:31:01 2011 +0200 @@ -1,272 +1,276 @@ -local addonName, A = ... - --- @todo clean the A table --- @todo check local copy of globals functions --- @todo show number of craftable items --- @todo show owned items --- @todo add support for dez ? --- @todo add support for cross tradeskill, like mining + forge/ingé - ---------------------------------------------------- --- Variables ---------------------------------------------------- --- Used by findglobals --- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME - --- Lua functions - --- Wow functions - --- constant vars - ---------------------------------------------------- --- Manage events ---------------------------------------------------- -A.EventsFrame = CreateFrame("Frame") - -local SCAN_DELAY = 0.2 -local t_throttle = SCAN_DELAY -local function throttleScan(self, t_elapsed) - t_throttle = t_throttle - t_elapsed - if t_throttle<0 then - self:SetScript("OnUpdate", nil) - - -- Close the external window if the tradeskill changed - if A.currentTradeSkill ~= GetTradeSkillLine() then - A.MenuFrame:Hide() - end - if IsTradeSkillGuild() or IsTradeSkillLinked() then - A.MenuFrame:Hide() - return - end - - -- Scan availabe recipes - A:ScanSimpleRecipes() - - -- Show makables reagents - A.updateCounts(GetTradeSkillSelectionIndex()) - end -end -A.EventsFrame:SetScript("OnEvent", function(self, event) - if event == "TRADE_SKILL_UPDATE" then - t_throttle = SCAN_DELAY - self:SetScript("OnUpdate", throttleScan) - - elseif event == "TRADE_SKILL_SHOW" then - A:Initialize() - A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW") - end -- if -end) -- function -A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW") -A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE") - ---------------------------------------------------- --- Initialize ---------------------------------------------------- -function A:Initialize() - - -- Register clics on reagent's buttons - for i=1,7 do - local btn = _G["TradeSkillReagent"..i] - btn:HookScript("OnDoubleClick", A.ProcessReagent) - btn:HookScript("OnEnter", A.btnEntered) - btn:HookScript("OnLeave", A.btnLeft) - btn.SplitStack = A.SplitStack - - local textureHighlight = btn:CreateTexture() - textureHighlight:Hide() - textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight") - textureHighlight:SetBlendMode("ADD") - textureHighlight:SetAllPoints("TradeSkillReagent"..i.."IconTexture") - btn.textureHighlight = textureHighlight - - local label = btn:CreateFontString(nil,"ARTWORK","GameFontHighlight") - label:SetSize(100,20) - label:SetPoint("TOPLEFT",btn,"TOPLEFT",4,-4) - label:SetJustifyH("LEFT") - label:SetJustifyV("TOP") - label:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE") - btn.label = label - end -- for - - A.tooltipRecipe = CreateFrame("GameTooltip", "ReagentMaker_tooltipRecipe",UIParent, "GameTooltipTemplate") - A.tooltipRecipe:SetFrameStrata("TOOLTIP") - A.tooltipRecipe:Hide() - --[[ - A.tooltipReagent = CreateFrame("GameTooltip", "ReagentMaker_tooltipReagent",UIParent, "GameTooltipTemplate") - A.tooltipReagent:SetFrameStrata("TOOLTIP") - A.tooltipReagent:Hide() - --]] -end -- function - --- Function run after selecting a item in the tradeskill window -function A.ProcessReagent(btn, ...) - - -- Do not manage guild tradeskill - if IsTradeSkillGuild() or IsTradeSkillLinked() then return end - - -- We want no modifiers, or shift to choose the number of reagent to craft - if IsModifierKeyDown() and not IsShiftKeyDown() then return end - local chooseNumberToCraft = IsShiftKeyDown() - - --A.SaveActiveFilters() - - -- Index of the reagent in the recipe, taken from the button name - local reagentRecipeIndex = A.buttonNumber(btn) - - -- ID of the reagent we want to craft - local reagentID = A.link2ID(GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex)) - - -- Continue only if the reagent is known - if not reagentID or not A.data[reagentID] then return end - - -- If only one recipe is known for the reagent, use it - if #(A.data[reagentID]) == 1 and not A.data[reagentID].spell then - local numMakable, reagentIndex = A.numMakable(reagentID) - if numMakable>0 then - A.craft(reagentID,reagentRecipeIndex,reagentIndex,numMakable,chooseNumberToCraft) - return - end - -- If we can make the item needed to make the reagent, open a window to make it - -- one step recursion, enables to mill to create an ink - if A.data[A.data[reagentID][1][1]] then - A.externalCraftWindow(A.data[reagentID][1][1]) - else - print("Sorry, can not make reagent...") - end - else - A.externalCraftWindow(reagentID) - end -- if - --A.RestoreActiveFilters() -end -- function - - ---------------------------------------------------- --- Craft items ---------------------------------------------------- --- function used after choosing the number of reagent to craft -function A.SplitStack(owner,split) - DoTradeSkill(owner.ReagentMaker_reagentIndex,tonumber(split)) - owner.ReagentMaker_reagentIndex = nil -end - --- Craft the reagent of an item, given it's position in the recipe -function A.craft(reagentID,reagentRecipeIndex,reagentIndex,numReagentMakable,chooseNumber) - -- Look at how many we need to make one item for the selected recipe - local numToMake = 1 - local selectedIndex = GetTradeSkillSelectionIndex() - local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(selectedIndex) - --if numAvailable==0 then - local reagentName, reagentTexture, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(selectedIndex, reagentRecipeIndex) - -- make enough reagents to craft one more item - numToMake = math.min(reagentCount*(1+numAvailable) - playerReagentCount,numReagentMakable) - --end -- if - - -- Choose number or craft directly - if chooseNumber and numReagentMakable>1 then - -- the dialog window is linked to the reagent button - local btn = _G["TradeSkillReagent"..reagentRecipeIndex] - - -- Store info to be able to run the function later - btn.ReagentMaker_reagentIndex = reagentIndex - - -- Open dialog - OpenStackSplitFrame(numReagentMakable, btn, "TOP", "BOTTOM") - - -- Fill in the number to make - numToMake = tostring(numToMake) - for i = 1,numToMake:len() do - StackSplitFrame_OnChar(StackSplitFrame,numToMake:gsub(i,i)) - end - StackSplitFrame.typing = 0 -- reinit the frame so tha the entered value will be erased on text entry - else - DoTradeSkill(reagentIndex,numToMake) - end -- if -end -- function - - --- Button hovering -function A.btnEntered(btn) - -- Do not manage guild tradeskill - if IsTradeSkillGuild() or IsTradeSkillLinked() then return end - - -- Index of the reagent in the recipe, taken from the button name - local reagentRecipeIndex = A.buttonNumber(btn) - - --A.SaveActiveFilters() - - -- ID of the reagent we want to craft - local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex) - local reagentID = A.link2ID(reagentLink) - - -- Continue only if the reagent is known - if not reagentID or not A.data[reagentID] then return end - - btn.textureHighlight:Show() - - -- Tooltips - local link - if A.data[reagentID].spell then - link = GetSpellLink(A.data[reagentID].spellID) - else - local index = A.findSkillIndex(reagentID) - if index then - link = GetTradeSkillRecipeLink(A.findSkillIndex(reagentID)) - end - end - - --A.RestoreActiveFilters() - - if link then - A.tooltipRecipe:SetOwner(btn) - A.tooltipRecipe:SetHyperlink(link) - A.tooltipRecipe:Show() - A.tooltipRecipe:ClearAllPoints() - A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT") - end -end - -function A.btnLeft(btn) - btn.textureHighlight:Hide() - A.tooltipRecipe:Hide() - --A.tooltipReagent:Hide() -end -- function - -function A.updateCounts(recipeIndex) - -- Needs an argument - if not recipeIndex then return end - - -- Do not manage guild tradeskill - if IsTradeSkillGuild() or IsTradeSkillLinked() then - for reagentRecipeIndex = 1,GetTradeSkillNumReagents(recipeIndex) do - _G["TradeSkillReagent"..reagentRecipeIndex].label:Hide() - end - return - end - - -- Count makable items and show it - for reagentRecipeIndex = 1,GetTradeSkillNumReagents(recipeIndex) do - -- ID of the reagent we want to craft - local reagentLink = GetTradeSkillReagentItemLink(recipeIndex, reagentRecipeIndex) - local reagentID = A.link2ID(reagentLink) - - local label = _G["TradeSkillReagent"..reagentRecipeIndex].label - if not label then return end - - -- Continue only if the reagent is known - if not reagentID or not A.data[reagentID] or #(A.data[reagentID]) ~= 1 or A.data[reagentID].spell then - label:Hide() - else - -- Count and show - local numMakable = A.numMakable(reagentID) - label:SetText(numMakable) - if numMakable==0 then - label:SetTextColor(1, 0, 0, 1) - else - label:SetTextColor(0, 5, 0, 1) - end -- if - label:Show() - end -- if - end -- for -end -- function -hooksecurefunc("SelectTradeSkill",A.updateCounts) +local addonName, A = ... + +-- @todo clean the A table +-- @todo check local copy of globals functions +-- @todo show number of craftable items +-- @todo show owned items +-- @todo add support for dez ? +-- @todo add support for cross tradeskill, like mining + forge/ingé + +--------------------------------------------------- +-- Variables +--------------------------------------------------- +-- Used by findglobals +-- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME + +-- Lua functions + +-- Wow functions + +-- constant vars + +--------------------------------------------------- +-- Manage events +--------------------------------------------------- +A.EventsFrame = CreateFrame("Frame") + +local SCAN_DELAY = 0.2 +local t_throttle = SCAN_DELAY +local function throttleScan(self, t_elapsed) + t_throttle = t_throttle - t_elapsed + if t_throttle<0 then + self:SetScript("OnUpdate", nil) + + -- Close the external window if the tradeskill changed + if A.currentTradeSkill ~= GetTradeSkillLine() then + A.MenuFrame:Hide() + end + if IsTradeSkillGuild() or IsTradeSkillLinked() then + A.MenuFrame:Hide() + return + end + + -- Scan availabe recipes + local ok = A:ScanSimpleRecipes() + + -- Show makables reagents + A.updateCounts(GetTradeSkillSelectionIndex()) + end +end +A.EventsFrame:SetScript("OnEvent", function(self, event) + if event == "TRADE_SKILL_UPDATE" then + t_throttle = SCAN_DELAY + self:SetScript("OnUpdate", throttleScan) + + elseif event == "TRADE_SKILL_SHOW" then + A:Initialize() + A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW") + end -- if +end) -- function +A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW") +A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE") + +--------------------------------------------------- +-- Initialize +--------------------------------------------------- +function A:Initialize() + + -- Register clics on reagent's buttons + for i=1,7 do + local btn = _G["TradeSkillReagent"..i] + btn:HookScript("OnDoubleClick", A.ProcessReagent) + btn:HookScript("OnEnter", A.btnEntered) + btn:HookScript("OnLeave", A.btnLeft) + btn.SplitStack = A.SplitStack + + local textureHighlight = btn:CreateTexture() + textureHighlight:Hide() + textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight") + textureHighlight:SetBlendMode("ADD") + textureHighlight:SetAllPoints("TradeSkillReagent"..i.."IconTexture") + btn.textureHighlight = textureHighlight + + local label = btn:CreateFontString(nil,"ARTWORK","GameFontHighlight") + label:SetSize(100,20) + label:SetPoint("TOPLEFT",btn,"TOPLEFT",4,-4) + label:SetJustifyH("LEFT") + label:SetJustifyV("TOP") + label:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE") + btn.label = label + end -- for + + A.tooltipRecipe = CreateFrame("GameTooltip", "ReagentMaker_tooltipRecipe",UIParent, "GameTooltipTemplate") + A.tooltipRecipe:SetFrameStrata("TOOLTIP") + A.tooltipRecipe:Hide() + --[[ + A.tooltipReagent = CreateFrame("GameTooltip", "ReagentMaker_tooltipReagent",UIParent, "GameTooltipTemplate") + A.tooltipReagent:SetFrameStrata("TOOLTIP") + A.tooltipReagent:Hide() + --]] +end -- function + +-- Function run after selecting a item in the tradeskill window +function A.ProcessReagent(btn, ...) + + -- Do not manage guild tradeskill + if IsTradeSkillGuild() or IsTradeSkillLinked() then return end + + -- We want no modifiers, or shift to choose the number of reagent to craft + if IsModifierKeyDown() and not IsShiftKeyDown() then return end + local chooseNumberToCraft = IsShiftKeyDown() + + --A.SaveActiveFilters() + + -- Index of the reagent in the recipe, taken from the button name + local reagentRecipeIndex = A.buttonNumber(btn) + + -- ID of the reagent we want to craft + local reagentID = A.link2ID(GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex)) + + -- Continue only if the reagent is known + if not reagentID or not A.data[reagentID] then return end + + -- If only one recipe is known for the reagent, use it + if #(A.data[reagentID]) == 1 and not A.data[reagentID].spell then + local numMakable, reagentIndex = A.numMakable(reagentID) + if not numMakable then + print("Sorry, i can't determine the number of makables reagents...") + return + end + if numMakable>0 then + A.craft(reagentID,reagentRecipeIndex,reagentIndex,numMakable,chooseNumberToCraft) + return + end + -- If we can make the item needed to make the reagent, open a window to make it + -- one step recursion, enables to mill to create an ink + if A.data[A.data[reagentID][1][1]] then + A.externalCraftWindow(A.data[reagentID][1][1]) + else + print("Sorry, couldn't make reagent...") + end + else + A.externalCraftWindow(reagentID) + end -- if + --A.RestoreActiveFilters() +end -- function + + +--------------------------------------------------- +-- Craft items +--------------------------------------------------- +-- function used after choosing the number of reagent to craft +function A.SplitStack(owner,split) + DoTradeSkill(owner.ReagentMaker_reagentIndex,tonumber(split)) + owner.ReagentMaker_reagentIndex = nil +end + +-- Craft the reagent of an item, given it's position in the recipe +function A.craft(reagentID,reagentRecipeIndex,reagentIndex,numReagentMakable,chooseNumber) + -- Look at how many we need to make one item for the selected recipe + local numToMake = 1 + local selectedIndex = GetTradeSkillSelectionIndex() + local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(selectedIndex) + --if numAvailable==0 then + local reagentName, reagentTexture, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(selectedIndex, reagentRecipeIndex) + -- make enough reagents to craft one more item + numToMake = math.min(reagentCount*(1+numAvailable) - playerReagentCount,numReagentMakable) + --end -- if + + -- Choose number or craft directly + if chooseNumber and numReagentMakable>1 then + -- the dialog window is linked to the reagent button + local btn = _G["TradeSkillReagent"..reagentRecipeIndex] + + -- Store info to be able to run the function later + btn.ReagentMaker_reagentIndex = reagentIndex + + -- Open dialog + OpenStackSplitFrame(numReagentMakable, btn, "TOP", "BOTTOM") + + -- Fill in the number to make + numToMake = tostring(numToMake) + for i = 1,numToMake:len() do + StackSplitFrame_OnChar(StackSplitFrame,numToMake:gsub(i,i)) + end + StackSplitFrame.typing = 0 -- reinit the frame so tha the entered value will be erased on text entry + else + DoTradeSkill(reagentIndex,numToMake) + end -- if +end -- function + + +-- Button hovering +function A.btnEntered(btn) + -- Do not manage guild tradeskill + if IsTradeSkillGuild() or IsTradeSkillLinked() then return end + + -- Index of the reagent in the recipe, taken from the button name + local reagentRecipeIndex = A.buttonNumber(btn) + + --A.SaveActiveFilters() + + -- ID of the reagent we want to craft + local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex) + local reagentID = A.link2ID(reagentLink) + + -- Continue only if the reagent is known + if not reagentID or not A.data[reagentID] then return end + + btn.textureHighlight:Show() + + -- Tooltips + local link + if A.data[reagentID].spell then + link = GetSpellLink(A.data[reagentID].spellID) + else + local reagentIndex = A.findSkillIndex(reagentID) + if reagentIndex then + link = GetTradeSkillRecipeLink(A.findSkillIndex(reagentID)) + end + end + + --A.RestoreActiveFilters() + + if link then + A.tooltipRecipe:SetOwner(btn) + A.tooltipRecipe:SetHyperlink(link) + A.tooltipRecipe:Show() + A.tooltipRecipe:ClearAllPoints() + A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT") + end +end + +function A.btnLeft(btn) + btn.textureHighlight:Hide() + A.tooltipRecipe:Hide() + --A.tooltipReagent:Hide() +end -- function + +function A.updateCounts(recipeIndex) + -- Needs an argument + if not recipeIndex then return end + + -- Do not manage guild tradeskill + if IsTradeSkillGuild() or IsTradeSkillLinked() then + for reagentRecipeIndex = 1,GetTradeSkillNumReagents(recipeIndex) do + _G["TradeSkillReagent"..reagentRecipeIndex].label:Hide() + end + return + end + + -- Count makable items and show it + for reagentRecipeIndex = 1,GetTradeSkillNumReagents(recipeIndex) do + -- ID of the reagent we want to craft + local reagentLink = GetTradeSkillReagentItemLink(recipeIndex, reagentRecipeIndex) + local reagentID = A.link2ID(reagentLink) + + local label = _G["TradeSkillReagent"..reagentRecipeIndex].label + if not label then return end + + -- Continue only if the reagent is known + if not reagentID or not A.data[reagentID] or #(A.data[reagentID]) ~= 1 or A.data[reagentID].spell then + label:Hide() + else + -- Count and show + local numMakable = A.numMakable(reagentID) + label:SetText(numMakable or "?") + if not numMakable or numMakable==0 then + label:SetTextColor(1, 0, 0, 1) + else + label:SetTextColor(0, 5, 0, 1) + end -- if + label:Show() + end -- if + end -- for +end -- function +hooksecurefunc("SelectTradeSkill",A.updateCounts)
--- a/utils.lua Wed Apr 27 23:46:20 2011 +0200 +++ b/utils.lua Thu Apr 28 19:31:01 2011 +0200 @@ -34,11 +34,11 @@ function A.numMakable(reagentID) -- Look for the recipe to make the item local reagentIndex = A.findSkillIndex(reagentID) - if not reagentIndex then return 0 end + if not reagentIndex then return end -- Check how many items we can craft local skillName, skillType, numReagentMakable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(reagentIndex) - return numReagentMakable or 0, reagentIndex + return numReagentMakable, reagentIndex end -- Find the first tradeskill index of the recipe to make an item