Mercurial > wow > reagentmaker
comparison ReagentMaker.lua @ 111:af23986010ef v1.1beta0
Rewrote the main part to clarify things, should have removed some hidden nasty bugs.
| author | contrebasse |
|---|---|
| date | Thu, 02 Jun 2011 23:07:23 +0200 |
| parents | d60d6b4cab0c |
| children | c79ab5443ee5 |
comparison
equal
deleted
inserted
replaced
| 110:d60d6b4cab0c | 111:af23986010ef |
|---|---|
| 1 local addonName, A = ... | 1 local addonName, A = ... |
| 2 | 2 |
| 3 -- @todo clean the A table | 3 -- @todo add support for cross tradeskill, like mining + forge/ingé |
| 4 -- @todo check local copy of globals functions | |
| 5 -- @todo add support for dez ? | 4 -- @todo add support for dez ? |
| 6 -- @todo add support for hidden recipes, removing filtering => save the reagent count to be able to compute the number of craftable items | 5 -- @todo scroll to the selected recipe on opening ? |
| 7 -- @todo add support for cross tradeskill, like mining + forge/ingé | 6 -- @todo add a button to clear search ? |
| 8 -- @todo when a reagent can not be crafted and the recipe has many reagents, do like ReverseEngeneering and go to this recipe (with a one step return button) | 7 |
| 9 -- @todo scroll to the selected recipe on opening (usefull also for the previous todo) | 8 -- @bug Enter when choosing number of crafts |
| 10 -- @todo shift+clic on a reagent name while the serachbar is focused fills the serachbar with the reagent name (idem with the crafted item) | |
| 11 -- @todo add a button to clear search | |
| 12 -- @todo add a button to cast a campfire when coocking | |
| 13 | 9 |
| 14 --------------------------------------------------- | 10 --------------------------------------------------- |
| 15 -- Variables | 11 -- Variables |
| 16 --------------------------------------------------- | 12 --------------------------------------------------- |
| 17 -- Used by findglobals | 13 -- Used by findglobals |
| 18 -- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME | 14 -- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME, UIParent |
| 19 | 15 |
| 20 -- Lua functions | 16 -- Lua functions |
| 21 | 17 |
| 22 -- Wow functions | 18 -- Wow functions |
| 19 local GetTradeSkillLine = GetTradeSkillLine | |
| 20 local IsTradeSkillGuild = IsTradeSkillGuild | |
| 21 local IsTradeSkillLinked = IsTradeSkillLinked | |
| 22 local GetTradeSkillSelectionIndex = GetTradeSkillSelectionIndex | |
| 23 local GetTradeSkillNumReagents = GetTradeSkillNumReagents | |
| 24 local GetTradeSkillReagentItemLink = GetTradeSkillReagentItemLink | |
| 23 | 25 |
| 24 -- constant vars | 26 -- constant vars |
| 25 | 27 local GameTooltip = GameTooltip |
| 26 --------------------------------------------------- | 28 |
| 27 -- Manage events | 29 --------------------------------------------------- |
| 30 -- Manage events and throttling | |
| 28 --------------------------------------------------- | 31 --------------------------------------------------- |
| 29 A.EventsFrame = CreateFrame("Frame") | 32 A.EventsFrame = CreateFrame("Frame") |
| 30 | 33 |
| 31 local SCAN_DELAY = 0.2 | 34 local SCAN_DELAY = 0.2 |
| 32 local t_throttle = SCAN_DELAY | 35 local t_throttle = SCAN_DELAY |
| 61 self:SetScript("OnUpdate", throttleScan) | 64 self:SetScript("OnUpdate", throttleScan) |
| 62 A.ManageCampFireBtn() | 65 A.ManageCampFireBtn() |
| 63 | 66 |
| 64 elseif event == "PLAYER_REGEN_DISABLED" then | 67 elseif event == "PLAYER_REGEN_DISABLED" then |
| 65 A.HideCampFireBtn() | 68 A.HideCampFireBtn() |
| 69 | |
| 66 elseif event == "PLAYER_REGEN_ENABLED" then | 70 elseif event == "PLAYER_REGEN_ENABLED" then |
| 67 A.ManageCampFireBtn() | 71 A.ManageCampFireBtn() |
| 68 | 72 |
| 69 elseif event == "TRADE_SKILL_SHOW" then | 73 elseif event == "TRADE_SKILL_SHOW" then |
| 70 A:Initialize() | 74 A:Initialize() |
| 71 A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW") | 75 A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW") |
| 72 end -- if | 76 end -- if |
| 73 end) -- function | 77 end) -- function |
| 78 | |
| 79 --@todo Unregister events when not needed | |
| 74 A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW") | 80 A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW") |
| 75 A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE") | 81 A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE") |
| 76 A.EventsFrame:RegisterEvent("PLAYER_REGEN_ENABLED") | 82 A.EventsFrame:RegisterEvent("PLAYER_REGEN_ENABLED") |
| 77 A.EventsFrame:RegisterEvent("PLAYER_REGEN_DISABLED") | 83 A.EventsFrame:RegisterEvent("PLAYER_REGEN_DISABLED") |
| 84 | |
| 78 | 85 |
| 79 --------------------------------------------------- | 86 --------------------------------------------------- |
| 80 -- Initialize | 87 -- Initialize |
| 81 --------------------------------------------------- | 88 --------------------------------------------------- |
| 82 function A:Initialize() | 89 function A:Initialize() |
| 113 | 120 |
| 114 -- Button for enchanting directy on a scroll | 121 -- Button for enchanting directy on a scroll |
| 115 A.LoadEnchantOnScroll() | 122 A.LoadEnchantOnScroll() |
| 116 end -- function | 123 end -- function |
| 117 | 124 |
| 118 -- Function run after selecting a item in the tradeskill window | 125 --------------------------------------------------- |
| 119 function A.ProcessReagent(btn, ...) | 126 -- Dynamic display |
| 120 --SPELL_FAILED_REAGENTS = "Missing reagent: %s"; | 127 --------------------------------------------------- |
| 121 --ERR_SPELL_FAILED_REAGENTS_GENERIC = "Missing reagent"; | 128 -- Button hovering (entered) |
| 122 --ERR_INTERNAL_BAG_ERROR = "Internal Bag Error"; | |
| 123 --SPELL_FAILED_ERROR = "Internal error"; | |
| 124 | |
| 125 -- Do not manage guild tradeskill | |
| 126 if IsTradeSkillGuild() or IsTradeSkillLinked() then return end | |
| 127 | |
| 128 -- We want no modifiers, or shift to choose the number of reagent to craft | |
| 129 if IsModifierKeyDown() and not IsShiftKeyDown() then return end | |
| 130 local chooseNumberToCraft = IsShiftKeyDown() | |
| 131 | |
| 132 -- Index of the reagent in the recipe, taken from the button name | |
| 133 local reagentRecipeIndex = A.buttonNumber(btn) | |
| 134 | |
| 135 -- ID of the reagent we want to craft | |
| 136 local recipeIndex = GetTradeSkillSelectionIndex() | |
| 137 local reagentID = A.link2ID(GetTradeSkillReagentItemLink(recipeIndex, reagentRecipeIndex)) | |
| 138 | |
| 139 -- Continue only if the reagent is known | |
| 140 if not reagentID or not A.data[reagentID] then return end | |
| 141 | |
| 142 -- If only one recipe is known for the reagent, use it | |
| 143 if #(A.data[reagentID]) == 1 and not A.data[reagentID][1].macro then | |
| 144 if A.data[reagentID][1].tradeskillName and A.data[reagentID][1].tradeskillName ~= GetTradeSkillLine() then | |
| 145 A.Error(A.L["The recipe to make this reagent is in another tradeskill. Currently ReagentMaker can not manage such a case, sorry."]) | |
| 146 return | |
| 147 end | |
| 148 | |
| 149 local reagentIndex = A.findSkillIndex(reagentID) -- finds only the first recipe that creates the reagent, should check recipe name too | |
| 150 | |
| 151 -- Try to show the recipe by removing filters once if it was not found | |
| 152 if not reagentIndex then | |
| 153 A.SaveActiveFilters(A.data[reagentID][1].header) | |
| 154 reagentIndex = A.findSkillIndex(reagentID) | |
| 155 end | |
| 156 if not reagentIndex then | |
| 157 A.Error(A.L["The recipe to make the reagent seems to be hidden, it is not makable. Try to remove the filters on the recipes."]) | |
| 158 A.RestoreActiveFilters() | |
| 159 return | |
| 160 end | |
| 161 | |
| 162 local numMakable = A.numMakable(reagentID) | |
| 163 if not numMakable then | |
| 164 A.Error(A.L["There was a problem while retrieving informations, please retry."]) | |
| 165 A.RestoreActiveFilters() | |
| 166 return | |
| 167 end | |
| 168 if numMakable>0 then | |
| 169 A.craft(recipeIndex,reagentRecipeIndex,reagentIndex,numMakable,chooseNumberToCraft) | |
| 170 A.RestoreActiveFilters() | |
| 171 return | |
| 172 end | |
| 173 | |
| 174 -- If we can make the item needed to make the reagent, open a window to make it | |
| 175 -- one step recursion, enables to mill to create an ink | |
| 176 if A.data[reagentID][1][1] and A.data[A.data[reagentID][1][1]] then | |
| 177 if A.externalCraftWindow(A.data[reagentID][1][1],reagentID) ~= false then | |
| 178 A.RestoreActiveFilters() | |
| 179 return | |
| 180 end | |
| 181 end | |
| 182 | |
| 183 A.Error(A.L["You do not have enough reagents to craft [%s]"]:format(GetItemInfo(reagentID) or "item #"..reagentID)) | |
| 184 A.RestoreActiveFilters() | |
| 185 return | |
| 186 else | |
| 187 A.externalCraftWindow(reagentID) | |
| 188 end -- if | |
| 189 --A.RestoreActiveFilters() | |
| 190 end -- function | |
| 191 | |
| 192 | |
| 193 --------------------------------------------------- | |
| 194 -- Craft items | |
| 195 --------------------------------------------------- | |
| 196 -- function used after choosing the number of reagent to craft | |
| 197 function A.SplitStack(owner,split) | |
| 198 DoTradeSkill(owner.ReagentMaker_reagentIndex,tonumber(split)) | |
| 199 owner.ReagentMaker_reagentIndex = nil | |
| 200 end | |
| 201 | |
| 202 -- Craft the reagent of an item, given it's position in the recipe | |
| 203 function A.craft(recipeIndex,reagentRecipeIndex,reagentIndex,numReagentMakable,chooseNumber) | |
| 204 -- Look at how many we need to make one item for the selected recipe | |
| 205 local numToMake = 1 | |
| 206 local _, _, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(recipeIndex, reagentRecipeIndex) | |
| 207 -- make enough reagents to craft one more item | |
| 208 numToMake = math.min(math.floor(playerReagentCount/reagentCount+1)*reagentCount-playerReagentCount,numReagentMakable) | |
| 209 | |
| 210 -- take into account that some recipe craft more than one item | |
| 211 -- use the mean between min and max, but make at least one... | |
| 212 local minMade, maxMade = GetTradeSkillNumMade(reagentIndex) | |
| 213 numToMake = math.max(math.floor(2*numToMake/(maxMade+minMade)),1) | |
| 214 | |
| 215 -- Choose number or craft directly | |
| 216 if chooseNumber then | |
| 217 -- the dialog window is linked to the reagent button | |
| 218 local btn = _G["TradeSkillReagent"..reagentRecipeIndex] | |
| 219 | |
| 220 -- Store info to be able to run the function later | |
| 221 btn.ReagentMaker_reagentIndex = reagentIndex | |
| 222 | |
| 223 -- Open dialog | |
| 224 OpenStackSplitFrame(numReagentMakable, btn, "TOP", "BOTTOM") | |
| 225 | |
| 226 -- Fill in the number to make | |
| 227 numToMake = tostring(numToMake) | |
| 228 for i = 1,numToMake:len() do | |
| 229 StackSplitFrame_OnChar(StackSplitFrame,numToMake:gsub(i,i)) | |
| 230 end | |
| 231 StackSplitFrame.typing = 0 -- reinit the frame so that the entered value will be erased on text entry | |
| 232 else | |
| 233 DoTradeSkill(reagentIndex,numToMake) | |
| 234 end -- if | |
| 235 end -- function | |
| 236 | |
| 237 | |
| 238 -- Button hovering | |
| 239 function A.btnEntered(btn) | 129 function A.btnEntered(btn) |
| 240 -- Do not manage guild tradeskill | 130 -- Do not manage guild tradeskill |
| 241 if IsTradeSkillGuild() or IsTradeSkillLinked() then return end | 131 if IsTradeSkillGuild() or IsTradeSkillLinked() then return end |
| 242 | 132 |
| 243 -- Index of the reagent in the recipe, taken from the button name | 133 -- Index of the reagent in the recipe, taken from the button name |
| 244 local reagentRecipeIndex = A.buttonNumber(btn) | 134 local reagentIndexInRecipe = A.buttonNumber(btn) |
| 245 | 135 |
| 246 -- ID of the reagent we want to craft | 136 -- ID of the reagent we want to craft |
| 247 local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex) | 137 local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentIndexInRecipe) |
| 248 local reagentID = A.link2ID(reagentLink) | 138 local reagentID = A.link2ID(reagentLink) |
| 249 | 139 |
| 250 -- Continue only if the reagent is known | 140 -- Continue only if the reagent is known |
| 251 if not reagentID or not A.data[reagentID] then return end | 141 if not reagentID or not A.data[reagentID] then return end |
| 252 | 142 |
| 264 A.tooltipRecipe:ClearAllPoints() | 154 A.tooltipRecipe:ClearAllPoints() |
| 265 A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT") | 155 A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT") |
| 266 end | 156 end |
| 267 end | 157 end |
| 268 | 158 |
| 159 -- Button hovering (left) | |
| 269 function A.btnLeft(btn) | 160 function A.btnLeft(btn) |
| 270 btn.textureHighlight:Hide() | 161 btn.textureHighlight:Hide() |
| 271 A.tooltipRecipe:Hide() | 162 A.tooltipRecipe:Hide() |
| 272 end -- function | 163 end -- function |
| 273 | 164 |
| 165 -- Show counts on buttons | |
| 274 function A.updateCounts(recipeIndex) | 166 function A.updateCounts(recipeIndex) |
| 275 -- Needs an argument | 167 -- Needs an argument |
| 276 if not recipeIndex then return end | 168 if not recipeIndex then return end |
| 277 | 169 |
| 278 -- Do not manage guild tradeskill | 170 -- Do not manage guild tradeskill |
| 279 if IsTradeSkillGuild() or IsTradeSkillLinked() then | 171 if IsTradeSkillGuild() or IsTradeSkillLinked() then |
| 280 for reagentRecipeIndex = 1,GetTradeSkillNumReagents(recipeIndex) do | 172 for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do |
| 281 -- If the normal tradeskill hasn't been opened yet, the field 'label' doesn't exists yet | 173 -- If the normal tradeskill hasn't been opened yet, the field 'label' doesn't exists yet |
| 282 local label = _G["TradeSkillReagent"..reagentRecipeIndex].label | 174 local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label |
| 283 if label then | 175 if label then |
| 284 label:Hide() | 176 label:Hide() |
| 285 end | 177 end |
| 286 end | 178 end |
| 287 return | 179 return |
| 288 end | 180 end |
| 289 | 181 |
| 290 -- Count makable items and show it | 182 -- Count makable items and show it |
| 291 for reagentRecipeIndex = 1,GetTradeSkillNumReagents(recipeIndex) do | 183 for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do |
| 292 -- ID of the reagent we want to craft | 184 -- ID of the reagent we want to craft |
| 293 local reagentLink = GetTradeSkillReagentItemLink(recipeIndex, reagentRecipeIndex) | 185 local reagentID = A.link2ID(GetTradeSkillReagentItemLink(recipeIndex, reagentIndexInRecipe)) |
| 294 local reagentID = A.link2ID(reagentLink) | 186 |
| 295 | 187 local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label |
| 296 local label = _G["TradeSkillReagent"..reagentRecipeIndex].label | 188 if label then |
| 297 if not label then break end -- Shouldn't happen... | 189 -- Continue only if the reagent is known |
| 298 | 190 if not reagentID or not A.data[reagentID] then |
| 299 -- Continue only if the reagent is known | 191 label:Hide() |
| 300 if not reagentID or not A.data[reagentID] then | |
| 301 label:Hide() | |
| 302 else | |
| 303 -- Count and show | |
| 304 local numMakable = A.numMakable(reagentID) | |
| 305 --if not numMakable or #(A.data[reagentID]) ~= 1 or A.data[reagentID][1].macro then | |
| 306 if not numMakable then | |
| 307 label:SetText("?") | |
| 308 label:SetTextColor(0, 0.5, 1, 1) -- blue | |
| 309 else | 192 else |
| 310 label:SetText(numMakable) | 193 -- Count and show |
| 311 if numMakable==0 then | 194 local numMakable = A.numMakable(reagentID) |
| 312 label:SetTextColor(1, 0, 0, 1) -- red | 195 if not numMakable then |
| 196 label:SetText("?") | |
| 197 label:SetTextColor(0, 0.5, 1, 1) -- blue | |
| 313 else | 198 else |
| 314 label:SetTextColor(0, 1, 0, 1) -- green | 199 label:SetText(numMakable) |
| 315 end | 200 if numMakable==0 then |
| 201 label:SetTextColor(1, 0, 0, 1) -- red | |
| 202 else | |
| 203 label:SetTextColor(0, 1, 0, 1) -- green | |
| 204 end | |
| 205 end -- if | |
| 206 label:Show() | |
| 316 end -- if | 207 end -- if |
| 317 label:Show() | |
| 318 end -- if | 208 end -- if |
| 319 end -- for | 209 end -- for |
| 320 end -- function | 210 end -- function |
| 321 hooksecurefunc("SelectTradeSkill",A.updateCounts) | 211 hooksecurefunc("SelectTradeSkill",A.updateCounts) |
