Mercurial > wow > reagentmaker
diff ReagentMaker.lua @ 111:af23986010ef v1.1beta0
Rewrote the main part to clarify things, should have removed some hidden nasty bugs.
author | contrebasse |
---|---|
date | Thu, 02 Jun 2011 23:07:23 +0200 |
parents | d60d6b4cab0c |
children | c79ab5443ee5 |
line wrap: on
line diff
--- a/ReagentMaker.lua Thu Jun 02 18:23:42 2011 +0200 +++ b/ReagentMaker.lua Thu Jun 02 23:07:23 2011 +0200 @@ -1,30 +1,33 @@ local addonName, A = ... --- @todo clean the A table --- @todo check local copy of globals functions +-- @todo add support for cross tradeskill, like mining + forge/ingé -- @todo add support for dez ? --- @todo add support for hidden recipes, removing filtering => save the reagent count to be able to compute the number of craftable items --- @todo add support for cross tradeskill, like mining + forge/ingé --- @todo when a reagent can not be crafted and the recipe has many reagents, do like ReverseEngeneering and go to this recipe (with a one step return button) --- @todo scroll to the selected recipe on opening (usefull also for the previous todo) --- @todo shift+clic on a reagent name while the serachbar is focused fills the serachbar with the reagent name (idem with the crafted item) --- @todo add a button to clear search --- @todo add a button to cast a campfire when coocking +-- @todo scroll to the selected recipe on opening ? +-- @todo add a button to clear search ? + +-- @bug Enter when choosing number of crafts --------------------------------------------------- -- Variables --------------------------------------------------- -- Used by findglobals --- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME +-- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME, UIParent -- Lua functions -- Wow functions +local GetTradeSkillLine = GetTradeSkillLine +local IsTradeSkillGuild = IsTradeSkillGuild +local IsTradeSkillLinked = IsTradeSkillLinked +local GetTradeSkillSelectionIndex = GetTradeSkillSelectionIndex +local GetTradeSkillNumReagents = GetTradeSkillNumReagents +local GetTradeSkillReagentItemLink = GetTradeSkillReagentItemLink -- constant vars +local GameTooltip = GameTooltip --------------------------------------------------- --- Manage events +-- Manage events and throttling --------------------------------------------------- A.EventsFrame = CreateFrame("Frame") @@ -63,6 +66,7 @@ elseif event == "PLAYER_REGEN_DISABLED" then A.HideCampFireBtn() + elseif event == "PLAYER_REGEN_ENABLED" then A.ManageCampFireBtn() @@ -71,11 +75,14 @@ A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW") end -- if end) -- function + +--@todo Unregister events when not needed A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW") A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE") A.EventsFrame:RegisterEvent("PLAYER_REGEN_ENABLED") A.EventsFrame:RegisterEvent("PLAYER_REGEN_DISABLED") + --------------------------------------------------- -- Initialize --------------------------------------------------- @@ -115,136 +122,19 @@ A.LoadEnchantOnScroll() end -- function --- Function run after selecting a item in the tradeskill window -function A.ProcessReagent(btn, ...) - --SPELL_FAILED_REAGENTS = "Missing reagent: %s"; - --ERR_SPELL_FAILED_REAGENTS_GENERIC = "Missing reagent"; - --ERR_INTERNAL_BAG_ERROR = "Internal Bag Error"; - --SPELL_FAILED_ERROR = "Internal error"; - - -- 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() - - -- 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 recipeIndex = GetTradeSkillSelectionIndex() - local reagentID = A.link2ID(GetTradeSkillReagentItemLink(recipeIndex, 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][1].macro then - if A.data[reagentID][1].tradeskillName and A.data[reagentID][1].tradeskillName ~= GetTradeSkillLine() then - A.Error(A.L["The recipe to make this reagent is in another tradeskill. Currently ReagentMaker can not manage such a case, sorry."]) - return - end - - local reagentIndex = A.findSkillIndex(reagentID) -- finds only the first recipe that creates the reagent, should check recipe name too - - -- Try to show the recipe by removing filters once if it was not found - if not reagentIndex then - A.SaveActiveFilters(A.data[reagentID][1].header) - reagentIndex = A.findSkillIndex(reagentID) - end - if not reagentIndex then - A.Error(A.L["The recipe to make the reagent seems to be hidden, it is not makable. Try to remove the filters on the recipes."]) - A.RestoreActiveFilters() - return - end - - local numMakable = A.numMakable(reagentID) - if not numMakable then - A.Error(A.L["There was a problem while retrieving informations, please retry."]) - A.RestoreActiveFilters() - return - end - if numMakable>0 then - A.craft(recipeIndex,reagentRecipeIndex,reagentIndex,numMakable,chooseNumberToCraft) - A.RestoreActiveFilters() - 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[reagentID][1][1] and A.data[A.data[reagentID][1][1]] then - if A.externalCraftWindow(A.data[reagentID][1][1],reagentID) ~= false then - A.RestoreActiveFilters() - return - end - end - - A.Error(A.L["You do not have enough reagents to craft [%s]"]:format(GetItemInfo(reagentID) or "item #"..reagentID)) - A.RestoreActiveFilters() - return - else - A.externalCraftWindow(reagentID) - end -- if - --A.RestoreActiveFilters() -end -- function - - --------------------------------------------------- --- Craft items +-- Dynamic display --------------------------------------------------- --- 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(recipeIndex,reagentRecipeIndex,reagentIndex,numReagentMakable,chooseNumber) - -- Look at how many we need to make one item for the selected recipe - local numToMake = 1 - local _, _, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(recipeIndex, reagentRecipeIndex) - -- make enough reagents to craft one more item - numToMake = math.min(math.floor(playerReagentCount/reagentCount+1)*reagentCount-playerReagentCount,numReagentMakable) - - -- take into account that some recipe craft more than one item - -- use the mean between min and max, but make at least one... - local minMade, maxMade = GetTradeSkillNumMade(reagentIndex) - numToMake = math.max(math.floor(2*numToMake/(maxMade+minMade)),1) - - -- Choose number or craft directly - if chooseNumber 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 that the entered value will be erased on text entry - else - DoTradeSkill(reagentIndex,numToMake) - end -- if -end -- function - - --- Button hovering +-- Button hovering (entered) 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) + local reagentIndexInRecipe = A.buttonNumber(btn) -- ID of the reagent we want to craft - local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex) + local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentIndexInRecipe) local reagentID = A.link2ID(reagentLink) -- Continue only if the reagent is known @@ -266,20 +156,22 @@ end end +-- Button hovering (left) function A.btnLeft(btn) btn.textureHighlight:Hide() A.tooltipRecipe:Hide() end -- function +-- Show counts on buttons 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 + for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do -- If the normal tradeskill hasn't been opened yet, the field 'label' doesn't exists yet - local label = _G["TradeSkillReagent"..reagentRecipeIndex].label + local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label if label then label:Hide() end @@ -288,33 +180,31 @@ end -- Count makable items and show it - for reagentRecipeIndex = 1,GetTradeSkillNumReagents(recipeIndex) do + for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do -- ID of the reagent we want to craft - local reagentLink = GetTradeSkillReagentItemLink(recipeIndex, reagentRecipeIndex) - local reagentID = A.link2ID(reagentLink) + local reagentID = A.link2ID(GetTradeSkillReagentItemLink(recipeIndex, reagentIndexInRecipe)) - local label = _G["TradeSkillReagent"..reagentRecipeIndex].label - if not label then break end -- Shouldn't happen... - - -- Continue only if the reagent is known - if not reagentID or not A.data[reagentID] then - label:Hide() - else - -- Count and show - local numMakable = A.numMakable(reagentID) - --if not numMakable or #(A.data[reagentID]) ~= 1 or A.data[reagentID][1].macro then - if not numMakable then - label:SetText("?") - label:SetTextColor(0, 0.5, 1, 1) -- blue + local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label + if label then + -- Continue only if the reagent is known + if not reagentID or not A.data[reagentID] then + label:Hide() else - label:SetText(numMakable) - if numMakable==0 then - label:SetTextColor(1, 0, 0, 1) -- red + -- Count and show + local numMakable = A.numMakable(reagentID) + if not numMakable then + label:SetText("?") + label:SetTextColor(0, 0.5, 1, 1) -- blue else - label:SetTextColor(0, 1, 0, 1) -- green - end + label:SetText(numMakable) + if numMakable==0 then + label:SetTextColor(1, 0, 0, 1) -- red + else + label:SetTextColor(0, 1, 0, 1) -- green + end + end -- if + label:Show() end -- if - label:Show() end -- if end -- for end -- function