annotate ReagentMaker.lua @ 46:40d6886d1966

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