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