contrebasse@0: local addonName, A = ... contrebasse@0: contrebasse@0: -- @todo clean the A table contrebasse@0: -- @todo check local copy of globals functions contrebasse@0: -- @todo add support for sub-recipes (like ink plus milling) contrebasse@0: -- @todo show a tooltip contrebasse@0: -- @todo show number of craftable items contrebasse@0: -- @todo show owned items contrebasse@0: -- @todo add support for dez ? contrebasse@0: -- @todo add support for cross tradeskill, like mining + forge/ingé contrebasse@0: -- @todo icon on reagent's button contrebasse@0: contrebasse@0: --------------------------------------------------- contrebasse@0: -- Variables contrebasse@0: --------------------------------------------------- contrebasse@0: -- Used by findglobals contrebasse@0: -- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME contrebasse@0: contrebasse@0: -- Lua functions contrebasse@0: contrebasse@0: -- Wow functions contrebasse@0: contrebasse@0: -- constant vars contrebasse@0: contrebasse@0: --------------------------------------------------- contrebasse@0: -- Manage events contrebasse@0: --------------------------------------------------- contrebasse@0: A.EventsFrame = CreateFrame("Frame") contrebasse@0: contrebasse@3: A.EventsFrame:SetScript("OnEvent", function(self, event, ...) contrebasse@3: if event == "TRADE_SKILL_UPDATE" then contrebasse@3: -- Close the external window if the tradeskill changed contrebasse@3: if A.currentTradeSkill ~= GetTradeSkillLine() then contrebasse@3: A.MenuFrame:Hide() contrebasse@3: end contrebasse@13: contrebasse@13: if IsTradeSkillGuild() or IsTradeSkillLinked() then contrebasse@13: A.MenuFrame:Hide() contrebasse@13: return contrebasse@13: end contrebasse@13: contrebasse@13: -- Scan availabe recipes contrebasse@13: A:ScanSimpleRecipes() contrebasse@13: contrebasse@3: elseif event == "TRADE_SKILL_SHOW" then contrebasse@13: if IsTradeSkillGuild() or IsTradeSkillLinked() then contrebasse@13: A.MenuFrame:Hide() contrebasse@13: return contrebasse@13: end contrebasse@0: A:Initialize() contrebasse@13: A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW") contrebasse@0: end -- if contrebasse@3: end) -- function contrebasse@0: A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW") contrebasse@3: A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE") contrebasse@0: contrebasse@0: --------------------------------------------------- contrebasse@0: -- Initialize contrebasse@0: --------------------------------------------------- contrebasse@0: function A:Initialize() contrebasse@0: contrebasse@3: -- Register clics on reagent's buttons contrebasse@3: for i=1,7 do contrebasse@3: local btn = _G["TradeSkillReagent"..i]; contrebasse@3: btn:HookScript("OnDoubleClick", A.ProcessReagent); contrebasse@3: btn:HookScript("OnEnter", A.btnEntered) contrebasse@3: btn:HookScript("OnLeave", A.btnLeft) contrebasse@3: btn.SplitStack = A.SplitStack contrebasse@1: contrebasse@3: local textureHighlight = btn:CreateTexture() contrebasse@3: textureHighlight:Hide() contrebasse@3: textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight") contrebasse@3: textureHighlight:SetBlendMode("ADD") contrebasse@3: --textureHighlight:SetPoint("TOPLEFT") contrebasse@3: --textureHighlight:SetSize(btn:GetHeight(),btn:GetHeight()) contrebasse@3: textureHighlight:SetAllPoints("TradeSkillReagent"..i.."IconTexture") contrebasse@3: btn.textureHighlight = textureHighlight contrebasse@3: contrebasse@3: local label = btn:CreateFontString(nil,"ARTWORK","GameFontHighlight") contrebasse@3: label:SetSize(100,20) contrebasse@3: label:SetPoint("TOPLEFT",btn,"TOPLEFT",4,-4) contrebasse@3: label:SetJustifyH("LEFT") contrebasse@3: label:SetJustifyV("TOP") contrebasse@3: label:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE") contrebasse@3: btn.label = label contrebasse@3: end -- for contrebasse@3: contrebasse@3: A.tooltipRecipe = CreateFrame("GameTooltip", "ReagentMaker_tooltipRecipe",UIParent, "GameTooltipTemplate") contrebasse@3: A.tooltipRecipe:SetFrameStrata("TOOLTIP") contrebasse@3: A.tooltipRecipe:Hide() contrebasse@7: --[[ contrebasse@3: A.tooltipReagent = CreateFrame("GameTooltip", "ReagentMaker_tooltipReagent",UIParent, "GameTooltipTemplate") contrebasse@3: A.tooltipReagent:SetFrameStrata("TOOLTIP") contrebasse@3: A.tooltipReagent:Hide() contrebasse@7: --]] contrebasse@3: end -- function contrebasse@3: contrebasse@13: -- Function run after selecting a item in the tradeskill window contrebasse@13: function A.ProcessReagent(btn, ...) contrebasse@13: -- Do not manage guild tradeskill contrebasse@13: if IsTradeSkillGuild() or IsTradeSkillLinked() then return end contrebasse@3: contrebasse@3: -- We want no modifiers, or shift to choose the number of reagent to craft contrebasse@3: if IsModifierKeyDown() and not IsShiftKeyDown() then return end contrebasse@3: local chooseNumberToCraft = IsShiftKeyDown() contrebasse@3: contrebasse@3: -- Index of the reagent in the recipe, taken from the button name contrebasse@3: local reagentRecipeIndex = A.buttonNumber(btn) contrebasse@3: contrebasse@3: -- ID of the reagent we want to craft contrebasse@3: local reagentID = A.link2ID(GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex)) contrebasse@3: contrebasse@3: -- Continue only if the reagent is known contrebasse@3: if not reagentID or not A.data[reagentID] then return end contrebasse@3: contrebasse@3: -- If only one recipe is known for the reagent, use it contrebasse@3: if #(A.data[reagentID]) == 1 and not A.data[reagentID].spell then contrebasse@3: local numMakable, reagentIndex = A.numMakable(reagentID) contrebasse@3: if numMakable>0 then contrebasse@3: A.craft(reagentID,reagentRecipeIndex,reagentIndex,numMakable,chooseNumberToCraft) contrebasse@3: return contrebasse@3: end contrebasse@3: -- If we can make the item needed to make the reagent, open a window to make it contrebasse@3: -- one step recursion, enables to mill to create an ink contrebasse@3: if A.data[A.data[reagentID][1][1]] then contrebasse@3: A.externalCraftWindow(A.data[reagentID][1][1]) contrebasse@3: else contrebasse@3: print("Sorry, can not make reagent...") contrebasse@3: end contrebasse@3: else contrebasse@3: A.externalCraftWindow(reagentID) contrebasse@0: end -- if contrebasse@0: end -- function contrebasse@0: contrebasse@0: contrebasse@0: --------------------------------------------------- contrebasse@0: -- Craft items contrebasse@0: --------------------------------------------------- contrebasse@3: -- function used after choosing the number of reagent to craft contrebasse@3: function A.SplitStack(owner,split) contrebasse@3: DoTradeSkill(owner.ReagentMaker_reagentIndex,tonumber(split)) contrebasse@3: owner.ReagentMaker_reagentIndex = nil contrebasse@0: end contrebasse@0: contrebasse@3: -- Craft the reagent of an item, given it's position in the recipe contrebasse@3: function A.craft(reagentID,reagentRecipeIndex,reagentIndex,numReagentMakable,chooseNumber) contrebasse@3: -- Look at how many we need to make one item for the selected recipe contrebasse@3: local numToMake = 1 contrebasse@3: local selectedIndex = GetTradeSkillSelectionIndex() contrebasse@3: local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(selectedIndex) contrebasse@3: if numAvailable==0 then contrebasse@3: local reagentName, reagentTexture, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(selectedIndex, reagentRecipeIndex) contrebasse@3: numToMake = math.min(reagentCount - playerReagentCount,numReagentMakable) contrebasse@3: end -- if contrebasse@0: contrebasse@3: -- Choose number or craft directly contrebasse@3: if chooseNumber and numReagentMakable>1 then contrebasse@3: -- the dialog window is linked to the reagent button contrebasse@3: local btn = _G["TradeSkillReagent"..reagentRecipeIndex] contrebasse@3: contrebasse@3: -- Store info to be able to run the function later contrebasse@3: btn.ReagentMaker_reagentIndex = reagentIndex contrebasse@3: contrebasse@3: -- Open dialog contrebasse@3: OpenStackSplitFrame(numReagentMakable, btn, "TOP", "BOTTOM") contrebasse@3: contrebasse@3: -- Fill in the number to make contrebasse@3: numToMake = tostring(numToMake) contrebasse@3: for i = 1,numToMake:len() do contrebasse@3: StackSplitFrame_OnChar(StackSplitFrame,numToMake:gsub(i,i)) contrebasse@3: end contrebasse@3: StackSplitFrame.typing = 0 -- reinit the frame so tha the entered value will be erased on text entry contrebasse@3: else contrebasse@3: DoTradeSkill(reagentIndex,numToMake) contrebasse@3: end -- if contrebasse@3: end -- function contrebasse@3: contrebasse@3: contrebasse@3: -- Button hovering contrebasse@3: function A.btnEntered(btn) contrebasse@13: -- Do not manage guild tradeskill contrebasse@13: if IsTradeSkillGuild() or IsTradeSkillLinked() then return end contrebasse@13: contrebasse@3: -- Index of the reagent in the recipe, taken from the button name contrebasse@3: local reagentRecipeIndex = A.buttonNumber(btn) contrebasse@3: contrebasse@3: -- ID of the reagent we want to craft contrebasse@3: local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex) contrebasse@3: local reagentID = A.link2ID(reagentLink) contrebasse@3: contrebasse@3: -- Continue only if the reagent is known contrebasse@3: if not reagentID or not A.data[reagentID] then return end contrebasse@3: contrebasse@3: btn.textureHighlight:Show() contrebasse@3: contrebasse@3: if #(A.data[reagentID]) == 1 and not A.data[reagentID].spell then contrebasse@3: local numMakable = A.numMakable(reagentID) contrebasse@3: btn.label:SetText(numMakable) contrebasse@3: if numMakable==0 then contrebasse@3: btn.label:SetTextColor(1, 0, 0, 1) contrebasse@3: else contrebasse@3: btn.label:SetTextColor(0, 5, 0, 1) contrebasse@3: end contrebasse@3: btn.label:Show() contrebasse@0: end contrebasse@0: contrebasse@5: -- Tooltips contrebasse@15: local reagentIndex = A.findSkillIndex(reagentID) contrebasse@15: if reagentIndex then contrebasse@15: A.tooltipRecipe:SetOwner(btn) contrebasse@15: if A.data[reagentID].spell then contrebasse@15: A.tooltipRecipe:SetHyperlink(GetSpellLink(A.data[reagentID].spellID)) contrebasse@15: else contrebasse@15: A.tooltipRecipe:SetHyperlink(GetTradeSkillRecipeLink(reagentIndex)) contrebasse@15: end contrebasse@15: A.tooltipRecipe:Show() contrebasse@15: A.tooltipRecipe:ClearAllPoints() contrebasse@15: --A.tooltipRecipe:SetPoint("TOPLEFT",btn,"TOPRIGHT") contrebasse@15: A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT") contrebasse@15: contrebasse@15: --[[ contrebasse@15: if #(A.data[reagentID]) == 1 then contrebasse@15: A.tooltipReagent:SetOwner(A.tooltipRecipe) contrebasse@15: local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(A.data[reagentID][1][1]) contrebasse@15: A.tooltipReagent:SetHyperlink(link) contrebasse@15: A.tooltipReagent:Show() contrebasse@15: A.tooltipReagent:ClearAllPoints() contrebasse@15: A.tooltipReagent:SetPoint("BOTTOMLEFT",A.tooltipRecipe,"BOTTOMRIGHT") contrebasse@15: end contrebasse@15: --]] contrebasse@6: end contrebasse@0: end contrebasse@0: contrebasse@3: function A.btnLeft(btn) contrebasse@3: btn.textureHighlight:Hide() contrebasse@3: btn.label:Hide() contrebasse@3: A.tooltipRecipe:Hide() contrebasse@8: --A.tooltipReagent:Hide() contrebasse@0: end