annotate ReagentMaker.lua @ 15:cc56799582f2

Use local references to global functions to speed up scanning
author contrebasse
date Wed, 06 Apr 2011 00:28:13 +0200
parents 5eb02d3e1647
children 5336b3a19d4f
rev   line source
contrebasse@0 1 local addonName, A = ...
contrebasse@0 2
contrebasse@0 3 -- @todo clean the A table
contrebasse@0 4 -- @todo check local copy of globals functions
contrebasse@0 5 -- @todo add support for sub-recipes (like ink plus milling)
contrebasse@0 6 -- @todo show a tooltip
contrebasse@0 7 -- @todo show number of craftable items
contrebasse@0 8 -- @todo show owned items
contrebasse@0 9 -- @todo add support for dez ?
contrebasse@0 10 -- @todo add support for cross tradeskill, like mining + forge/ingé
contrebasse@0 11 -- @todo icon on reagent's button
contrebasse@0 12
contrebasse@0 13 ---------------------------------------------------
contrebasse@0 14 -- Variables
contrebasse@0 15 ---------------------------------------------------
contrebasse@0 16 -- Used by findglobals
contrebasse@0 17 -- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME
contrebasse@0 18
contrebasse@0 19 -- Lua functions
contrebasse@0 20
contrebasse@0 21 -- Wow functions
contrebasse@0 22
contrebasse@0 23 -- constant vars
contrebasse@0 24
contrebasse@0 25 ---------------------------------------------------
contrebasse@0 26 -- Manage events
contrebasse@0 27 ---------------------------------------------------
contrebasse@0 28 A.EventsFrame = CreateFrame("Frame")
contrebasse@0 29
contrebasse@3 30 A.EventsFrame:SetScript("OnEvent", function(self, event, ...)
contrebasse@3 31 if event == "TRADE_SKILL_UPDATE" then
contrebasse@3 32 -- Close the external window if the tradeskill changed
contrebasse@3 33 if A.currentTradeSkill ~= GetTradeSkillLine() then
contrebasse@3 34 A.MenuFrame:Hide()
contrebasse@3 35 end
contrebasse@13 36
contrebasse@13 37 if IsTradeSkillGuild() or IsTradeSkillLinked() then
contrebasse@13 38 A.MenuFrame:Hide()
contrebasse@13 39 return
contrebasse@13 40 end
contrebasse@13 41
contrebasse@13 42 -- Scan availabe recipes
contrebasse@13 43 A:ScanSimpleRecipes()
contrebasse@13 44
contrebasse@3 45 elseif event == "TRADE_SKILL_SHOW" then
contrebasse@13 46 if IsTradeSkillGuild() or IsTradeSkillLinked() then
contrebasse@13 47 A.MenuFrame:Hide()
contrebasse@13 48 return
contrebasse@13 49 end
contrebasse@0 50 A:Initialize()
contrebasse@13 51 A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW")
contrebasse@0 52 end -- if
contrebasse@3 53 end) -- function
contrebasse@0 54 A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW")
contrebasse@3 55 A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE")
contrebasse@0 56
contrebasse@0 57 ---------------------------------------------------
contrebasse@0 58 -- Initialize
contrebasse@0 59 ---------------------------------------------------
contrebasse@0 60 function A:Initialize()
contrebasse@0 61
contrebasse@3 62 -- Register clics on reagent's buttons
contrebasse@3 63 for i=1,7 do
contrebasse@3 64 local btn = _G["TradeSkillReagent"..i];
contrebasse@3 65 btn:HookScript("OnDoubleClick", A.ProcessReagent);
contrebasse@3 66 btn:HookScript("OnEnter", A.btnEntered)
contrebasse@3 67 btn:HookScript("OnLeave", A.btnLeft)
contrebasse@3 68 btn.SplitStack = A.SplitStack
contrebasse@1 69
contrebasse@3 70 local textureHighlight = btn:CreateTexture()
contrebasse@3 71 textureHighlight:Hide()
contrebasse@3 72 textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight")
contrebasse@3 73 textureHighlight:SetBlendMode("ADD")
contrebasse@3 74 --textureHighlight:SetPoint("TOPLEFT")
contrebasse@3 75 --textureHighlight:SetSize(btn:GetHeight(),btn:GetHeight())
contrebasse@3 76 textureHighlight:SetAllPoints("TradeSkillReagent"..i.."IconTexture")
contrebasse@3 77 btn.textureHighlight = textureHighlight
contrebasse@3 78
contrebasse@3 79 local label = btn:CreateFontString(nil,"ARTWORK","GameFontHighlight")
contrebasse@3 80 label:SetSize(100,20)
contrebasse@3 81 label:SetPoint("TOPLEFT",btn,"TOPLEFT",4,-4)
contrebasse@3 82 label:SetJustifyH("LEFT")
contrebasse@3 83 label:SetJustifyV("TOP")
contrebasse@3 84 label:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE")
contrebasse@3 85 btn.label = label
contrebasse@3 86 end -- for
contrebasse@3 87
contrebasse@3 88 A.tooltipRecipe = CreateFrame("GameTooltip", "ReagentMaker_tooltipRecipe",UIParent, "GameTooltipTemplate")
contrebasse@3 89 A.tooltipRecipe:SetFrameStrata("TOOLTIP")
contrebasse@3 90 A.tooltipRecipe:Hide()
contrebasse@7 91 --[[
contrebasse@3 92 A.tooltipReagent = CreateFrame("GameTooltip", "ReagentMaker_tooltipReagent",UIParent, "GameTooltipTemplate")
contrebasse@3 93 A.tooltipReagent:SetFrameStrata("TOOLTIP")
contrebasse@3 94 A.tooltipReagent:Hide()
contrebasse@7 95 --]]
contrebasse@3 96 end -- function
contrebasse@3 97
contrebasse@13 98 -- Function run after selecting a item in the tradeskill window
contrebasse@13 99 function A.ProcessReagent(btn, ...)
contrebasse@13 100 -- Do not manage guild tradeskill
contrebasse@13 101 if IsTradeSkillGuild() or IsTradeSkillLinked() then return end
contrebasse@3 102
contrebasse@3 103 -- We want no modifiers, or shift to choose the number of reagent to craft
contrebasse@3 104 if IsModifierKeyDown() and not IsShiftKeyDown() then return end
contrebasse@3 105 local chooseNumberToCraft = IsShiftKeyDown()
contrebasse@3 106
contrebasse@3 107 -- Index of the reagent in the recipe, taken from the button name
contrebasse@3 108 local reagentRecipeIndex = A.buttonNumber(btn)
contrebasse@3 109
contrebasse@3 110 -- ID of the reagent we want to craft
contrebasse@3 111 local reagentID = A.link2ID(GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex))
contrebasse@3 112
contrebasse@3 113 -- Continue only if the reagent is known
contrebasse@3 114 if not reagentID or not A.data[reagentID] then return end
contrebasse@3 115
contrebasse@3 116 -- If only one recipe is known for the reagent, use it
contrebasse@3 117 if #(A.data[reagentID]) == 1 and not A.data[reagentID].spell then
contrebasse@3 118 local numMakable, reagentIndex = A.numMakable(reagentID)
contrebasse@3 119 if numMakable>0 then
contrebasse@3 120 A.craft(reagentID,reagentRecipeIndex,reagentIndex,numMakable,chooseNumberToCraft)
contrebasse@3 121 return
contrebasse@3 122 end
contrebasse@3 123 -- If we can make the item needed to make the reagent, open a window to make it
contrebasse@3 124 -- one step recursion, enables to mill to create an ink
contrebasse@3 125 if A.data[A.data[reagentID][1][1]] then
contrebasse@3 126 A.externalCraftWindow(A.data[reagentID][1][1])
contrebasse@3 127 else
contrebasse@3 128 print("Sorry, can not make reagent...")
contrebasse@3 129 end
contrebasse@3 130 else
contrebasse@3 131 A.externalCraftWindow(reagentID)
contrebasse@0 132 end -- if
contrebasse@0 133 end -- function
contrebasse@0 134
contrebasse@0 135
contrebasse@0 136 ---------------------------------------------------
contrebasse@0 137 -- Craft items
contrebasse@0 138 ---------------------------------------------------
contrebasse@3 139 -- function used after choosing the number of reagent to craft
contrebasse@3 140 function A.SplitStack(owner,split)
contrebasse@3 141 DoTradeSkill(owner.ReagentMaker_reagentIndex,tonumber(split))
contrebasse@3 142 owner.ReagentMaker_reagentIndex = nil
contrebasse@0 143 end
contrebasse@0 144
contrebasse@3 145 -- Craft the reagent of an item, given it's position in the recipe
contrebasse@3 146 function A.craft(reagentID,reagentRecipeIndex,reagentIndex,numReagentMakable,chooseNumber)
contrebasse@3 147 -- Look at how many we need to make one item for the selected recipe
contrebasse@3 148 local numToMake = 1
contrebasse@3 149 local selectedIndex = GetTradeSkillSelectionIndex()
contrebasse@3 150 local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(selectedIndex)
contrebasse@3 151 if numAvailable==0 then
contrebasse@3 152 local reagentName, reagentTexture, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(selectedIndex, reagentRecipeIndex)
contrebasse@3 153 numToMake = math.min(reagentCount - playerReagentCount,numReagentMakable)
contrebasse@3 154 end -- if
contrebasse@0 155
contrebasse@3 156 -- Choose number or craft directly
contrebasse@3 157 if chooseNumber and numReagentMakable>1 then
contrebasse@3 158 -- the dialog window is linked to the reagent button
contrebasse@3 159 local btn = _G["TradeSkillReagent"..reagentRecipeIndex]
contrebasse@3 160
contrebasse@3 161 -- Store info to be able to run the function later
contrebasse@3 162 btn.ReagentMaker_reagentIndex = reagentIndex
contrebasse@3 163
contrebasse@3 164 -- Open dialog
contrebasse@3 165 OpenStackSplitFrame(numReagentMakable, btn, "TOP", "BOTTOM")
contrebasse@3 166
contrebasse@3 167 -- Fill in the number to make
contrebasse@3 168 numToMake = tostring(numToMake)
contrebasse@3 169 for i = 1,numToMake:len() do
contrebasse@3 170 StackSplitFrame_OnChar(StackSplitFrame,numToMake:gsub(i,i))
contrebasse@3 171 end
contrebasse@3 172 StackSplitFrame.typing = 0 -- reinit the frame so tha the entered value will be erased on text entry
contrebasse@3 173 else
contrebasse@3 174 DoTradeSkill(reagentIndex,numToMake)
contrebasse@3 175 end -- if
contrebasse@3 176 end -- function
contrebasse@3 177
contrebasse@3 178
contrebasse@3 179 -- Button hovering
contrebasse@3 180 function A.btnEntered(btn)
contrebasse@13 181 -- Do not manage guild tradeskill
contrebasse@13 182 if IsTradeSkillGuild() or IsTradeSkillLinked() then return end
contrebasse@13 183
contrebasse@3 184 -- Index of the reagent in the recipe, taken from the button name
contrebasse@3 185 local reagentRecipeIndex = A.buttonNumber(btn)
contrebasse@3 186
contrebasse@3 187 -- ID of the reagent we want to craft
contrebasse@3 188 local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex)
contrebasse@3 189 local reagentID = A.link2ID(reagentLink)
contrebasse@3 190
contrebasse@3 191 -- Continue only if the reagent is known
contrebasse@3 192 if not reagentID or not A.data[reagentID] then return end
contrebasse@3 193
contrebasse@3 194 btn.textureHighlight:Show()
contrebasse@3 195
contrebasse@3 196 if #(A.data[reagentID]) == 1 and not A.data[reagentID].spell then
contrebasse@3 197 local numMakable = A.numMakable(reagentID)
contrebasse@3 198 btn.label:SetText(numMakable)
contrebasse@3 199 if numMakable==0 then
contrebasse@3 200 btn.label:SetTextColor(1, 0, 0, 1)
contrebasse@3 201 else
contrebasse@3 202 btn.label:SetTextColor(0, 5, 0, 1)
contrebasse@3 203 end
contrebasse@3 204 btn.label:Show()
contrebasse@0 205 end
contrebasse@0 206
contrebasse@5 207 -- Tooltips
contrebasse@15 208 local reagentIndex = A.findSkillIndex(reagentID)
contrebasse@15 209 if reagentIndex then
contrebasse@15 210 A.tooltipRecipe:SetOwner(btn)
contrebasse@15 211 if A.data[reagentID].spell then
contrebasse@15 212 A.tooltipRecipe:SetHyperlink(GetSpellLink(A.data[reagentID].spellID))
contrebasse@15 213 else
contrebasse@15 214 A.tooltipRecipe:SetHyperlink(GetTradeSkillRecipeLink(reagentIndex))
contrebasse@15 215 end
contrebasse@15 216 A.tooltipRecipe:Show()
contrebasse@15 217 A.tooltipRecipe:ClearAllPoints()
contrebasse@15 218 --A.tooltipRecipe:SetPoint("TOPLEFT",btn,"TOPRIGHT")
contrebasse@15 219 A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT")
contrebasse@15 220
contrebasse@15 221 --[[
contrebasse@15 222 if #(A.data[reagentID]) == 1 then
contrebasse@15 223 A.tooltipReagent:SetOwner(A.tooltipRecipe)
contrebasse@15 224 local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(A.data[reagentID][1][1])
contrebasse@15 225 A.tooltipReagent:SetHyperlink(link)
contrebasse@15 226 A.tooltipReagent:Show()
contrebasse@15 227 A.tooltipReagent:ClearAllPoints()
contrebasse@15 228 A.tooltipReagent:SetPoint("BOTTOMLEFT",A.tooltipRecipe,"BOTTOMRIGHT")
contrebasse@15 229 end
contrebasse@15 230 --]]
contrebasse@6 231 end
contrebasse@0 232 end
contrebasse@0 233
contrebasse@3 234 function A.btnLeft(btn)
contrebasse@3 235 btn.textureHighlight:Hide()
contrebasse@3 236 btn.label:Hide()
contrebasse@3 237 A.tooltipRecipe:Hide()
contrebasse@8 238 --A.tooltipReagent:Hide()
contrebasse@0 239 end