annotate ReagentMaker.lua @ 17:5336b3a19d4f

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