Mercurial > wow > reagentmaker
view ReagentMaker.lua @ 19:f7b23db7bcc6
Correct tooltips for external tradeskills like milling
author | contrebasse |
---|---|
date | Fri, 08 Apr 2011 19:58:08 +0200 |
parents | c37c2a46723c |
children | 4ea38bae4174 |
line wrap: on
line source
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() 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:SetPoint("TOPLEFT") --textureHighlight:SetSize(btn:GetHeight(),btn:GetHeight()) 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() -- 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 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) numToMake = math.min(reagentCount - 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) -- 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() if #(A.data[reagentID]) == 1 and not A.data[reagentID].spell then local numMakable = A.numMakable(reagentID) btn.label:SetText(numMakable) if numMakable==0 then btn.label:SetTextColor(1, 0, 0, 1) else btn.label:SetTextColor(0, 5, 0, 1) end btn.label:Show() end -- Tooltips local link if A.data[reagentID].spell then link = GetSpellLink(A.data[reagentID].spellID) else link = GetTradeSkillRecipeLink(A.findSkillIndex(reagentID)) end if link then A.tooltipRecipe:SetOwner(btn) A.tooltipRecipe:SetHyperlink(link) A.tooltipRecipe:Show() A.tooltipRecipe:ClearAllPoints() --A.tooltipRecipe:SetPoint("TOPLEFT",btn,"TOPRIGHT") A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT") --[[ if #(A.data[reagentID]) == 1 then A.tooltipReagent:SetOwner(A.tooltipRecipe) local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(A.data[reagentID][1][1]) A.tooltipReagent:SetHyperlink(link) A.tooltipReagent:Show() A.tooltipReagent:ClearAllPoints() A.tooltipReagent:SetPoint("BOTTOMLEFT",A.tooltipRecipe,"BOTTOMRIGHT") end --]] end end function A.btnLeft(btn) btn.textureHighlight:Hide() btn.label:Hide() A.tooltipRecipe:Hide() --A.tooltipReagent:Hide() end