contrebasse@0
|
1 local addonName, A = ...
|
contrebasse@0
|
2
|
contrebasse@16
|
3 -- Lua functions
|
contrebasse@16
|
4 local tonumber = tonumber
|
contrebasse@16
|
5 local select = select
|
contrebasse@16
|
6 local sfind = string.find
|
contrebasse@16
|
7
|
contrebasse@16
|
8 -- Wow functions
|
contrebasse@16
|
9
|
contrebasse@3
|
10 -- DEBUG Print
|
contrebasse@3
|
11 function A.DEBUG(msg)
|
contrebasse@16
|
12 -- GLOBALS: DEFAULT_CHAT_FRAME
|
contrebasse@3
|
13 DEFAULT_CHAT_FRAME:AddMessage(msg or "nil",1,0,0)
|
contrebasse@3
|
14 end -- function
|
contrebasse@0
|
15
|
contrebasse@38
|
16 -- Messages to the user
|
contrebasse@38
|
17 function A.Warn(msg)
|
contrebasse@38
|
18 if not msg then return end
|
contrebasse@38
|
19 local event = "UI_INFO_MESSAGE"
|
contrebasse@38
|
20 UIErrorsFrame_OnEvent(UIErrorsFrame, event, msg)
|
contrebasse@38
|
21 end -- function
|
contrebasse@38
|
22 function A.Error(msg)
|
contrebasse@38
|
23 if not msg then return end
|
contrebasse@38
|
24 local event = "UI_ERROR_MESSAGE"
|
contrebasse@38
|
25 UIErrorsFrame_OnEvent(UIErrorsFrame, event, msg)
|
contrebasse@38
|
26 end -- function
|
contrebasse@38
|
27
|
contrebasse@3
|
28 -- Returns the item ID from its link
|
contrebasse@3
|
29 function A.link2ID(link)
|
contrebasse@16
|
30 return tonumber(select(3,sfind(link or "", "-*:(%d+)[:|].*")) or "")
|
contrebasse@3
|
31 end -- function
|
contrebasse@3
|
32
|
contrebasse@3
|
33 -- Returns the button number for the reagents buttons
|
contrebasse@3
|
34 function A.buttonNumber(btn)
|
contrebasse@3
|
35 -- "TradeSkillReagentN"
|
contrebasse@3
|
36 return tonumber(btn:GetName():sub(-1))
|
contrebasse@0
|
37 end
|
contrebasse@0
|
38
|
contrebasse@16
|
39 do
|
contrebasse@16
|
40 -- Wow functions
|
contrebasse@16
|
41 local GetTradeSkillInfo = GetTradeSkillInfo
|
contrebasse@16
|
42 local GetNumTradeSkills = GetNumTradeSkills
|
contrebasse@16
|
43 local GetTradeSkillItemLink = GetTradeSkillItemLink
|
contrebasse@0
|
44
|
contrebasse@16
|
45 -- Gives the number of craftable objects
|
contrebasse@108
|
46 --[[
|
contrebasse@16
|
47 function A.numMakable(reagentID)
|
contrebasse@16
|
48 -- Look for the recipe to make the item
|
contrebasse@16
|
49 local reagentIndex = A.findSkillIndex(reagentID)
|
contrebasse@25
|
50 if not reagentIndex then return end
|
contrebasse@3
|
51
|
contrebasse@16
|
52 -- Check how many items we can craft
|
contrebasse@16
|
53 local skillName, skillType, numReagentMakable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(reagentIndex)
|
contrebasse@25
|
54 return numReagentMakable, reagentIndex
|
contrebasse@16
|
55 end
|
contrebasse@108
|
56 --]]
|
contrebasse@108
|
57 function A.numMakable(reagentID)
|
contrebasse@108
|
58 -- No recipe
|
contrebasse@108
|
59 if not A.data[reagentID] then return 0 end
|
contrebasse@108
|
60
|
contrebasse@108
|
61 -- Many recipes
|
contrebasse@108
|
62 local n = 0
|
contrebasse@108
|
63 local itemCount
|
contrebasse@108
|
64 for _,recipe in pairs(A.data[reagentID]) do
|
contrebasse@108
|
65 if recipe[1] then -- only one reagent
|
contrebasse@108
|
66 itemCount = GetItemCount(recipe[1])
|
contrebasse@108
|
67 if not itemCount then return end
|
contrebasse@108
|
68 n = n + math.floor(itemCount/recipe[2])
|
contrebasse@108
|
69 else -- many reagents
|
contrebasse@108
|
70 local m
|
contrebasse@108
|
71 for _,reagent in pairs(recipe[2]) do
|
contrebasse@108
|
72 itemCount = GetItemCount(reagent[1])
|
contrebasse@108
|
73 if not itemCount then return end
|
contrebasse@108
|
74 if not m then
|
contrebasse@108
|
75 m = math.floor(itemCount/reagent[2])
|
contrebasse@108
|
76 else
|
contrebasse@108
|
77 m = math.min(m,math.floor(itemCount/reagent[2]))
|
contrebasse@108
|
78 end
|
contrebasse@108
|
79 if m==0 then break end
|
contrebasse@108
|
80 end
|
contrebasse@108
|
81 n = n + m
|
contrebasse@108
|
82 end -- if
|
contrebasse@108
|
83 end -- for
|
contrebasse@108
|
84 return n
|
contrebasse@108
|
85 end -- function
|
contrebasse@16
|
86
|
contrebasse@16
|
87 -- Find the first tradeskill index of the recipe to make an item
|
contrebasse@16
|
88 function A.findSkillIndex(itemID)
|
contrebasse@16
|
89 for i = 1,GetNumTradeSkills() do
|
contrebasse@82
|
90 local _, skillType = GetTradeSkillInfo(i)
|
contrebasse@16
|
91 if skillType == "header" then
|
contrebasse@16
|
92 else
|
contrebasse@70
|
93 local ID = A.link2ID(GetTradeSkillItemLink(i))
|
contrebasse@70
|
94 if ID and ID == itemID then
|
contrebasse@70
|
95 return i
|
contrebasse@3
|
96 end -- if
|
contrebasse@3
|
97 end -- if
|
contrebasse@16
|
98 end -- for
|
contrebasse@16
|
99 end -- function
|
contrebasse@16
|
100 end -- do
|
contrebasse@24
|
101
|
contrebasse@24
|
102
|
contrebasse@24
|
103 -- Taken from Datastore_Crafts
|
contrebasse@24
|
104 -- *** Scanning functions ***
|
contrebasse@24
|
105 do
|
contrebasse@24
|
106 local selectedTradeSkillIndex
|
contrebasse@107
|
107 local stateSaved
|
contrebasse@107
|
108 local filtersState = {}
|
contrebasse@24
|
109 local headersState = {}
|
contrebasse@24
|
110
|
contrebasse@107
|
111 local function ApplyFilters()
|
contrebasse@107
|
112 TradeSkillOnlyShowSkillUps(TradeSkillFrame.filterTbl.hasSkillUp);
|
contrebasse@107
|
113 TradeSkillOnlyShowMakeable(TradeSkillFrame.filterTbl.hasMaterials);
|
contrebasse@107
|
114 SetTradeSkillSubClassFilter(TradeSkillFrame.filterTbl.subClassValue, 1, 1);
|
contrebasse@107
|
115 SetTradeSkillInvSlotFilter(TradeSkillFrame.filterTbl.slotValue, 1, 1);
|
contrebasse@107
|
116 TradeSkillUpdateFilterBar();
|
contrebasse@107
|
117 CloseDropDownMenus();
|
contrebasse@107
|
118 end
|
contrebasse@107
|
119
|
contrebasse@82
|
120 function A.SaveActiveFilters(headerName)
|
contrebasse@82
|
121 A.blockScan = true
|
contrebasse@82
|
122
|
contrebasse@107
|
123 -- Save filters
|
contrebasse@108
|
124 filtersState.text = GetTradeSkillItemNameFilter()
|
contrebasse@108
|
125 filtersState.minLevel, filtersState.maxLevel = GetTradeSkillItemLevelFilter()
|
contrebasse@107
|
126 filtersState.hasMaterials = TradeSkillFrame.filterTbl.hasMaterials
|
contrebasse@107
|
127 filtersState.hasSkillUp = TradeSkillFrame.filterTbl.hasSkillUp
|
contrebasse@107
|
128 filtersState.subClassValue = TradeSkillFrame.filterTbl.subClassValue
|
contrebasse@107
|
129 filtersState.slotValue = TradeSkillFrame.filterTbl.slotValue
|
contrebasse@24
|
130
|
contrebasse@107
|
131 -- Remove all filters
|
contrebasse@108
|
132 SetTradeSkillItemNameFilter(nil)
|
contrebasse@108
|
133 SetTradeSkillItemLevelFilter(0, 0)
|
contrebasse@107
|
134 TradeSkillFrame.filterTbl.hasMaterials = false
|
contrebasse@107
|
135 TradeSkillFrame.filterTbl.hasSkillUp = false
|
contrebasse@107
|
136 TradeSkillFrame.filterTbl.subClassValue = -1
|
contrebasse@107
|
137 TradeSkillFrame.filterTbl.slotValue = -1
|
contrebasse@107
|
138 ApplyFilters()
|
contrebasse@24
|
139
|
contrebasse@24
|
140 -- Headers
|
contrebasse@107
|
141 headersState.headerName = headerName
|
contrebasse@24
|
142 for i = GetNumTradeSkills(), 1, -1 do -- 1st pass, expand all categories
|
contrebasse@82
|
143 local skillName, skillType, _, isExpanded = GetTradeSkillInfo(i)
|
contrebasse@108
|
144 if (skillType == "header") and skillName==headerName then
|
contrebasse@108
|
145 if not isExpanded then
|
contrebasse@108
|
146 ExpandTradeSkillSubClass(i)
|
contrebasse@108
|
147 table.insert(headersState,true)
|
contrebasse@108
|
148 else
|
contrebasse@108
|
149 table.insert(headersState,false)
|
contrebasse@24
|
150 end
|
contrebasse@108
|
151 end
|
contrebasse@24
|
152 end
|
contrebasse@24
|
153
|
contrebasse@108
|
154 stateSaved = true
|
contrebasse@108
|
155 A.blockScan = nil
|
contrebasse@108
|
156
|
contrebasse@107
|
157 --@todo Scroll down to the selected recipe
|
contrebasse@107
|
158 -- with TradeSkillSkillXX:Show() ?
|
contrebasse@24
|
159 end
|
contrebasse@24
|
160
|
contrebasse@24
|
161 function A.RestoreActiveFilters()
|
contrebasse@107
|
162 if not stateSaved then return end
|
contrebasse@82
|
163 A.blockScan = true
|
contrebasse@82
|
164
|
contrebasse@107
|
165 -- restore headers
|
contrebasse@24
|
166 for i = GetNumTradeSkills(), 1, -1 do
|
contrebasse@107
|
167 local skillName, skillType = GetTradeSkillInfo(i)
|
contrebasse@107
|
168 if (skillType == "header") and skillName==headersState.headerName and table.remove(headersState,1) then
|
contrebasse@24
|
169 CollapseTradeSkillSubClass(i)
|
contrebasse@24
|
170 end
|
contrebasse@24
|
171 end
|
contrebasse@24
|
172 wipe(headersState)
|
contrebasse@107
|
173
|
contrebasse@107
|
174 -- restore filters
|
contrebasse@108
|
175 SetTradeSkillItemNameFilter(filtersState.text)
|
contrebasse@108
|
176 SetTradeSkillItemLevelFilter(filtersState.minLevel, filtersState.maxLevel)
|
contrebasse@107
|
177 TradeSkillFrame.filterTbl.hasMaterials = filtersState.hasMaterials
|
contrebasse@107
|
178 TradeSkillFrame.filterTbl.hasSkillUp = filtersState.hasSkillUp
|
contrebasse@107
|
179 TradeSkillFrame.filterTbl.subClassValue = filtersState.subClassValue
|
contrebasse@107
|
180 TradeSkillFrame.filterTbl.slotValue = filtersState.slotValue
|
contrebasse@107
|
181 ApplyFilters()
|
contrebasse@107
|
182
|
contrebasse@108
|
183 stateSaved = nil
|
contrebasse@108
|
184 A.blockScan = nil
|
contrebasse@107
|
185
|
contrebasse@108
|
186 --@todo Scroll down to the selected recipe
|
contrebasse@108
|
187 -- with TradeSkillSkillXX:Show() ?
|
contrebasse@24
|
188 end
|
contrebasse@24
|
189 end
|
contrebasse@73
|
190
|
contrebasse@73
|
191 function A.isRecipeUnique(itemData)
|
contrebasse@73
|
192 local unique = true
|
contrebasse@107
|
193
|
contrebasse@73
|
194 -- Check if the item is made by only one recipe. If not, return
|
contrebasse@73
|
195 if #itemData>1 then
|
contrebasse@73
|
196 local spellLink
|
contrebasse@73
|
197 for _,v in ipairs(itemData) do
|
contrebasse@73
|
198 if not spellLink then
|
contrebasse@73
|
199 spellLink = v.spellLink
|
contrebasse@73
|
200 else
|
contrebasse@73
|
201 if v.spellLink ~= spellLink then
|
contrebasse@73
|
202 unique = nil
|
contrebasse@73
|
203 break
|
contrebasse@73
|
204 end
|
contrebasse@73
|
205 end
|
contrebasse@73
|
206 end
|
contrebasse@73
|
207 end
|
contrebasse@107
|
208
|
contrebasse@73
|
209 return unique
|
contrebasse@73
|
210 end
|
contrebasse@76
|
211
|
contrebasse@76
|
212 --[[
|
contrebasse@76
|
213 function A.isTradeskillUnique(itemData)
|
contrebasse@85
|
214 local spellName = itemData[1].spellName
|
contrebasse@107
|
215
|
contrebasse@76
|
216 -- Check if the item is made by only one recipe. If not, return
|
contrebasse@76
|
217 if #itemData>1 then
|
contrebasse@76
|
218 for _,v in ipairs(itemData) do
|
contrebasse@85
|
219 if v.spellName ~= spellName then
|
contrebasse@85
|
220 spellName = nil
|
contrebasse@76
|
221 break
|
contrebasse@76
|
222 end
|
contrebasse@76
|
223 end
|
contrebasse@76
|
224 end
|
contrebasse@89
|
225
|
contrebasse@85
|
226 return spellName
|
contrebasse@76
|
227 end
|
contrebasse@107
|
228 --]]
|