annotate ReagentMaker.lua @ 26:886be292feec

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