contrebasse@98
|
1 local addonName, A = ...
|
contrebasse@98
|
2
|
contrebasse@111
|
3 -- @todo add support for cross tradeskill, like mining + forge/ingé
|
contrebasse@98
|
4 -- @todo add support for dez ?
|
contrebasse@111
|
5 -- @todo scroll to the selected recipe on opening ?
|
contrebasse@111
|
6 -- @todo add a button to clear search ?
|
contrebasse@111
|
7
|
contrebasse@111
|
8 -- @bug Enter when choosing number of crafts
|
contrebasse@98
|
9
|
contrebasse@98
|
10 ---------------------------------------------------
|
contrebasse@98
|
11 -- Variables
|
contrebasse@98
|
12 ---------------------------------------------------
|
contrebasse@98
|
13 -- Used by findglobals
|
contrebasse@111
|
14 -- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME, UIParent
|
contrebasse@98
|
15
|
contrebasse@98
|
16 -- Lua functions
|
contrebasse@98
|
17
|
contrebasse@98
|
18 -- Wow functions
|
contrebasse@111
|
19 local GetTradeSkillLine = GetTradeSkillLine
|
contrebasse@111
|
20 local IsTradeSkillGuild = IsTradeSkillGuild
|
contrebasse@111
|
21 local IsTradeSkillLinked = IsTradeSkillLinked
|
contrebasse@111
|
22 local GetTradeSkillSelectionIndex = GetTradeSkillSelectionIndex
|
contrebasse@111
|
23 local GetTradeSkillNumReagents = GetTradeSkillNumReagents
|
contrebasse@111
|
24 local GetTradeSkillReagentItemLink = GetTradeSkillReagentItemLink
|
contrebasse@98
|
25
|
contrebasse@98
|
26 -- constant vars
|
contrebasse@111
|
27 local GameTooltip = GameTooltip
|
contrebasse@98
|
28
|
contrebasse@98
|
29 ---------------------------------------------------
|
contrebasse@111
|
30 -- Manage events and throttling
|
contrebasse@98
|
31 ---------------------------------------------------
|
contrebasse@98
|
32 A.EventsFrame = CreateFrame("Frame")
|
contrebasse@98
|
33
|
contrebasse@98
|
34 local SCAN_DELAY = 0.2
|
contrebasse@98
|
35 local t_throttle = SCAN_DELAY
|
contrebasse@98
|
36 local function throttleScan(self, t_elapsed)
|
contrebasse@98
|
37 t_throttle = t_throttle - t_elapsed
|
contrebasse@98
|
38 if t_throttle<0 then
|
contrebasse@98
|
39 self:SetScript("OnUpdate", nil)
|
contrebasse@98
|
40
|
contrebasse@98
|
41 -- Close the external window if the tradeskill changed
|
contrebasse@98
|
42 if A.currentTradeSkill ~= GetTradeSkillLine() then
|
contrebasse@98
|
43 A.MenuFrame:Hide()
|
contrebasse@98
|
44 end
|
contrebasse@98
|
45 if IsTradeSkillGuild() or IsTradeSkillLinked() then
|
contrebasse@98
|
46 A.MenuFrame:Hide()
|
contrebasse@98
|
47 return
|
contrebasse@98
|
48 end
|
contrebasse@98
|
49
|
contrebasse@98
|
50 -- Scan availabe recipes
|
contrebasse@98
|
51 -- Rescan in case of problem
|
contrebasse@98
|
52 if not A:ScanSimpleRecipes() then
|
contrebasse@98
|
53 t_throttle = SCAN_DELAY
|
contrebasse@98
|
54 self:SetScript("OnUpdate", throttleScan)
|
contrebasse@98
|
55 end
|
contrebasse@98
|
56
|
contrebasse@98
|
57 -- Show makables reagents
|
contrebasse@115
|
58 A.updateCount_throttle()
|
contrebasse@98
|
59 end
|
contrebasse@98
|
60 end
|
contrebasse@98
|
61 A.EventsFrame:SetScript("OnEvent", function(self, event)
|
contrebasse@115
|
62 --print("Throttle Scan :",event)
|
contrebasse@98
|
63 if event == "TRADE_SKILL_UPDATE" then
|
contrebasse@98
|
64 t_throttle = SCAN_DELAY
|
contrebasse@98
|
65 self:SetScript("OnUpdate", throttleScan)
|
contrebasse@101
|
66 A.ManageCampFireBtn()
|
contrebasse@101
|
67
|
contrebasse@101
|
68 elseif event == "PLAYER_REGEN_DISABLED" then
|
contrebasse@101
|
69 A.HideCampFireBtn()
|
contrebasse@111
|
70
|
contrebasse@101
|
71 elseif event == "PLAYER_REGEN_ENABLED" then
|
contrebasse@101
|
72 A.ManageCampFireBtn()
|
contrebasse@98
|
73
|
contrebasse@98
|
74 elseif event == "TRADE_SKILL_SHOW" then
|
contrebasse@98
|
75 A:Initialize()
|
contrebasse@98
|
76 A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW")
|
contrebasse@98
|
77 end -- if
|
contrebasse@98
|
78 end) -- function
|
contrebasse@111
|
79
|
contrebasse@111
|
80 --@todo Unregister events when not needed
|
contrebasse@98
|
81 A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW")
|
contrebasse@98
|
82 A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE")
|
contrebasse@98
|
83
|
contrebasse@111
|
84
|
contrebasse@98
|
85 ---------------------------------------------------
|
contrebasse@98
|
86 -- Initialize
|
contrebasse@98
|
87 ---------------------------------------------------
|
contrebasse@98
|
88 function A:Initialize()
|
contrebasse@98
|
89
|
contrebasse@98
|
90 -- Register clics on reagent's buttons
|
contrebasse@98
|
91 for i=1,7 do
|
contrebasse@98
|
92 local btn = _G["TradeSkillReagent"..i]
|
contrebasse@98
|
93 btn:HookScript("OnDoubleClick", A.ProcessReagent)
|
contrebasse@98
|
94 btn:HookScript("OnEnter", A.btnEntered)
|
contrebasse@98
|
95 btn:HookScript("OnLeave", A.btnLeft)
|
contrebasse@98
|
96 btn.SplitStack = A.SplitStack
|
contrebasse@98
|
97
|
contrebasse@98
|
98 local textureHighlight = btn:CreateTexture()
|
contrebasse@98
|
99 textureHighlight:Hide()
|
contrebasse@98
|
100 textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight")
|
contrebasse@110
|
101 --textureHighlight:SetTexture("Interface\\BUTTONS\\ButtonHilight-Square")
|
contrebasse@98
|
102 textureHighlight:SetBlendMode("ADD")
|
contrebasse@98
|
103 textureHighlight:SetAllPoints("TradeSkillReagent"..i.."IconTexture")
|
contrebasse@98
|
104 btn.textureHighlight = textureHighlight
|
contrebasse@98
|
105
|
contrebasse@98
|
106 local label = btn:CreateFontString(nil,"ARTWORK","GameFontHighlight")
|
contrebasse@98
|
107 label:SetSize(100,20)
|
contrebasse@98
|
108 label:SetPoint("TOPLEFT",btn,"TOPLEFT",4,-4)
|
contrebasse@98
|
109 label:SetJustifyH("LEFT")
|
contrebasse@98
|
110 label:SetJustifyV("TOP")
|
contrebasse@98
|
111 label:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE")
|
contrebasse@98
|
112 btn.label = label
|
contrebasse@98
|
113 end -- for
|
contrebasse@98
|
114
|
contrebasse@98
|
115 -- Secondary Tooltip
|
contrebasse@98
|
116 A.tooltipRecipe = CreateFrame("GameTooltip", "ReagentMaker_tooltipRecipe",UIParent, "GameTooltipTemplate")
|
contrebasse@98
|
117 A.tooltipRecipe:SetFrameStrata("TOOLTIP")
|
contrebasse@98
|
118 A.tooltipRecipe:Hide()
|
contrebasse@101
|
119
|
contrebasse@113
|
120 -- Used for the campfire button only
|
contrebasse@113
|
121 A.EventsFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
|
contrebasse@113
|
122 A.EventsFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
|
contrebasse@113
|
123
|
contrebasse@98
|
124 -- Button for enchanting directy on a scroll
|
contrebasse@98
|
125 A.LoadEnchantOnScroll()
|
contrebasse@98
|
126 end -- function
|
contrebasse@98
|
127
|
contrebasse@98
|
128 ---------------------------------------------------
|
contrebasse@111
|
129 -- Dynamic display
|
contrebasse@98
|
130 ---------------------------------------------------
|
contrebasse@111
|
131 -- Button hovering (entered)
|
contrebasse@98
|
132 function A.btnEntered(btn)
|
contrebasse@98
|
133 -- Do not manage guild tradeskill
|
contrebasse@98
|
134 if IsTradeSkillGuild() or IsTradeSkillLinked() then return end
|
contrebasse@98
|
135
|
contrebasse@98
|
136 -- Index of the reagent in the recipe, taken from the button name
|
contrebasse@111
|
137 local reagentIndexInRecipe = A.buttonNumber(btn)
|
contrebasse@98
|
138
|
contrebasse@98
|
139 -- ID of the reagent we want to craft
|
contrebasse@111
|
140 local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentIndexInRecipe)
|
contrebasse@98
|
141 local reagentID = A.link2ID(reagentLink)
|
contrebasse@98
|
142
|
contrebasse@98
|
143 -- Continue only if the reagent is known
|
contrebasse@98
|
144 if not reagentID or not A.data[reagentID] then return end
|
contrebasse@98
|
145
|
contrebasse@98
|
146 btn.textureHighlight:Show()
|
contrebasse@98
|
147
|
contrebasse@98
|
148 -- Check if the item is made by only one recipe. If not, return
|
contrebasse@98
|
149 if not A.isRecipeUnique(A.data[reagentID]) then return end
|
contrebasse@98
|
150
|
contrebasse@98
|
151 -- Tooltips
|
contrebasse@98
|
152 local link = A.data[reagentID][1].spellLink
|
contrebasse@98
|
153 if link then
|
contrebasse@98
|
154 A.tooltipRecipe:SetOwner(btn)
|
contrebasse@98
|
155 A.tooltipRecipe:SetHyperlink(link)
|
contrebasse@98
|
156 A.tooltipRecipe:Show()
|
contrebasse@98
|
157 A.tooltipRecipe:ClearAllPoints()
|
contrebasse@98
|
158 A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT")
|
contrebasse@98
|
159 end
|
contrebasse@98
|
160 end
|
contrebasse@98
|
161
|
contrebasse@111
|
162 -- Button hovering (left)
|
contrebasse@98
|
163 function A.btnLeft(btn)
|
contrebasse@98
|
164 btn.textureHighlight:Hide()
|
contrebasse@98
|
165 A.tooltipRecipe:Hide()
|
contrebasse@98
|
166 end -- function
|
contrebasse@98
|
167
|
contrebasse@111
|
168 -- Show counts on buttons
|
contrebasse@115
|
169 local CountThrottleFrame = CreateFrame("Frame")
|
contrebasse@115
|
170 local COUNT_DELAY = 0.1
|
contrebasse@115
|
171 local t_throttleCount = SCAN_DELAY
|
contrebasse@115
|
172 function UpdateCounts(recipeIndex)
|
contrebasse@98
|
173 -- Needs an argument
|
contrebasse@98
|
174 if not recipeIndex then return end
|
contrebasse@98
|
175
|
contrebasse@98
|
176 -- Do not manage guild tradeskill
|
contrebasse@98
|
177 if IsTradeSkillGuild() or IsTradeSkillLinked() then
|
contrebasse@111
|
178 for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do
|
contrebasse@98
|
179 -- If the normal tradeskill hasn't been opened yet, the field 'label' doesn't exists yet
|
contrebasse@111
|
180 local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label
|
contrebasse@98
|
181 if label then
|
contrebasse@98
|
182 label:Hide()
|
contrebasse@98
|
183 end
|
contrebasse@98
|
184 end
|
contrebasse@98
|
185 return
|
contrebasse@98
|
186 end
|
contrebasse@98
|
187
|
contrebasse@98
|
188 -- Count makable items and show it
|
contrebasse@111
|
189 for reagentIndexInRecipe = 1,GetTradeSkillNumReagents(recipeIndex) do
|
contrebasse@98
|
190 -- ID of the reagent we want to craft
|
contrebasse@111
|
191 local reagentID = A.link2ID(GetTradeSkillReagentItemLink(recipeIndex, reagentIndexInRecipe))
|
contrebasse@98
|
192
|
contrebasse@111
|
193 local label = _G["TradeSkillReagent"..reagentIndexInRecipe].label
|
contrebasse@111
|
194 if label then
|
contrebasse@111
|
195 -- Continue only if the reagent is known
|
contrebasse@111
|
196 if not reagentID or not A.data[reagentID] then
|
contrebasse@111
|
197 label:Hide()
|
contrebasse@98
|
198 else
|
contrebasse@111
|
199 -- Count and show
|
contrebasse@116
|
200 local numMakableMin, numMakableMax, numMakableIsApprox = A.numMakable(reagentID)
|
contrebasse@116
|
201 if not numMakableMin then
|
contrebasse@111
|
202 label:SetText("?")
|
contrebasse@111
|
203 label:SetTextColor(0, 0.5, 1, 1) -- blue
|
contrebasse@98
|
204 else
|
contrebasse@116
|
205 local txt = numMakableIsApprox and "~" or ""
|
contrebasse@116
|
206 if numMakableMin == numMakableMax then
|
contrebasse@116
|
207 label:SetFormattedText("%s%.2g",txt,numMakableMin)
|
contrebasse@116
|
208 else
|
contrebasse@116
|
209 label:SetFormattedText("%s%.2g-%.2g",txt,numMakableMin,numMakableMax)
|
contrebasse@116
|
210 end
|
contrebasse@116
|
211 if numMakableMax==0 then
|
contrebasse@111
|
212 label:SetTextColor(1, 0, 0, 1) -- red
|
contrebasse@111
|
213 else
|
contrebasse@111
|
214 label:SetTextColor(0, 1, 0, 1) -- green
|
contrebasse@111
|
215 end
|
contrebasse@111
|
216 end -- if
|
contrebasse@111
|
217 label:Show()
|
contrebasse@98
|
218 end -- if
|
contrebasse@98
|
219 end -- if
|
contrebasse@98
|
220 end -- for
|
contrebasse@98
|
221 end -- function
|
contrebasse@115
|
222 local function throttleCount(self, t_elapsed)
|
contrebasse@115
|
223 t_throttle = t_throttle - t_elapsed
|
contrebasse@115
|
224 if t_throttle<0 then
|
contrebasse@115
|
225 self:SetScript("OnUpdate", nil)
|
contrebasse@115
|
226
|
contrebasse@115
|
227 -- Show makables reagents
|
contrebasse@115
|
228 UpdateCounts(GetTradeSkillSelectionIndex())
|
contrebasse@115
|
229 end
|
contrebasse@115
|
230 end
|
contrebasse@115
|
231 function A.updateCount_throttle(self,event)
|
contrebasse@115
|
232 if not TradeSkillFrame or not TradeSkillFrame:IsVisible() or event=="TRADE_SKILL_CLOSE" then
|
contrebasse@115
|
233 CountThrottleFrame:UnregisterEvent("BAG_UPDATE")
|
contrebasse@115
|
234 t_throttleCount = 0
|
contrebasse@115
|
235 CountThrottleFrame:SetScript("OnUpdate", nil)
|
contrebasse@115
|
236 return
|
contrebasse@115
|
237 else
|
contrebasse@115
|
238 CountThrottleFrame:RegisterEvent("BAG_UPDATE")
|
contrebasse@115
|
239 end
|
contrebasse@115
|
240 t_throttleCount = SCAN_DELAY
|
contrebasse@115
|
241 CountThrottleFrame:SetScript("OnUpdate", throttleCount)
|
contrebasse@115
|
242
|
contrebasse@115
|
243 A.MenuFrame.updateCounts()
|
contrebasse@115
|
244 end
|
contrebasse@115
|
245 CountThrottleFrame:SetScript("OnEvent", A.updateCount_throttle)
|
contrebasse@115
|
246 CountThrottleFrame:RegisterEvent("TRADE_SKILL_SHOW")
|
contrebasse@115
|
247 CountThrottleFrame:RegisterEvent("TRADE_SKILL_UPDATE")
|
contrebasse@115
|
248 CountThrottleFrame:RegisterEvent("TRADE_SKILL_CLOSE")
|
contrebasse@115
|
249 hooksecurefunc("SelectTradeSkill",A.updateCount_throttle)
|