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 add support for sub-recipes (like ink plus milling)
|
contrebasse@0
|
6 -- @todo show a tooltip
|
contrebasse@0
|
7 -- @todo show number of craftable items
|
contrebasse@0
|
8 -- @todo show owned items
|
contrebasse@0
|
9 -- @todo add support for dez ?
|
contrebasse@0
|
10 -- @todo add support for cross tradeskill, like mining + forge/ingé
|
contrebasse@0
|
11 -- @todo icon on reagent's button
|
contrebasse@0
|
12
|
contrebasse@0
|
13 ---------------------------------------------------
|
contrebasse@0
|
14 -- Variables
|
contrebasse@0
|
15 ---------------------------------------------------
|
contrebasse@0
|
16 -- Used by findglobals
|
contrebasse@0
|
17 -- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME
|
contrebasse@0
|
18
|
contrebasse@0
|
19 -- Lua functions
|
contrebasse@0
|
20
|
contrebasse@0
|
21 -- Wow functions
|
contrebasse@0
|
22
|
contrebasse@0
|
23 -- constant vars
|
contrebasse@0
|
24
|
contrebasse@0
|
25 ---------------------------------------------------
|
contrebasse@0
|
26 -- Manage events
|
contrebasse@0
|
27 ---------------------------------------------------
|
contrebasse@0
|
28 A.EventsFrame = CreateFrame("Frame")
|
contrebasse@0
|
29
|
contrebasse@0
|
30 A.EventsFrame:SetScript("OnEvent", function(self, event)
|
contrebasse@0
|
31 if event == "TRADE_SKILL_SHOW" then
|
contrebasse@0
|
32 A:Initialize()
|
contrebasse@0
|
33 end -- if
|
contrebasse@0
|
34 end); -- function
|
contrebasse@0
|
35 A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW")
|
contrebasse@0
|
36
|
contrebasse@0
|
37
|
contrebasse@0
|
38 ---------------------------------------------------
|
contrebasse@0
|
39 -- Initialize
|
contrebasse@0
|
40 ---------------------------------------------------
|
contrebasse@0
|
41 function A:Initialize()
|
contrebasse@0
|
42 -- This part is done the first time only
|
contrebasse@0
|
43 if not self.MenuFrame then
|
contrebasse@0
|
44 -- Prepare the menu
|
contrebasse@0
|
45 self.MenuFrame = CreateFrame("Frame", "ReagentMakerDropDownMenu"); -- Needs a global name
|
contrebasse@0
|
46 self.MenuFrame.displayMode = "MENU";
|
contrebasse@0
|
47 self.MenuFrame.initialize = self.FillMenu;
|
contrebasse@0
|
48 self.MenuFrame.point = "TOPLEFT";
|
contrebasse@0
|
49 self.MenuFrame.relativePoint = "TOPRIGHT";
|
contrebasse@0
|
50
|
contrebasse@0
|
51 -- Register clics on reagent's buttons
|
contrebasse@0
|
52 for i=1,7 do
|
contrebasse@0
|
53 local button = _G["TradeSkillReagent"..i];
|
contrebasse@0
|
54 button:HookScript("OnClick", function() self:ToggleMenu(button, i) end);
|
contrebasse@0
|
55 --button:HookScript("OnEnter", function() self:Entered(button, i) end)
|
contrebasse@0
|
56 --button:HookScript("OnLeave", function() self:Left(button, i) end)
|
contrebasse@0
|
57 end -- for
|
contrebasse@0
|
58 end -- if
|
contrebasse@0
|
59
|
contrebasse@0
|
60 -- Scan availabe recipes
|
contrebasse@0
|
61 A:ScanSimpleRecipes()
|
contrebasse@0
|
62 end -- function
|
contrebasse@0
|
63
|
contrebasse@0
|
64
|
contrebasse@0
|
65 ---------------------------------------------------
|
contrebasse@0
|
66 -- Craft items
|
contrebasse@0
|
67 ---------------------------------------------------
|
contrebasse@0
|
68 do
|
contrebasse@0
|
69 -- WoW functions
|
contrebasse@0
|
70 local GetNumTradeSkills = GetNumTradeSkills
|
contrebasse@0
|
71 local GetTradeSkillInfo = GetTradeSkillInfo
|
contrebasse@0
|
72 local GetTradeSkillItemLink = GetTradeSkillItemLink
|
contrebasse@0
|
73
|
contrebasse@0
|
74
|
contrebasse@0
|
75 function A.findSkillIndex(itemID)
|
contrebasse@0
|
76 for i = 1,GetNumTradeSkills() do
|
contrebasse@0
|
77 local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(i)
|
contrebasse@0
|
78 if skillType == "header" then
|
contrebasse@0
|
79 else
|
contrebasse@0
|
80 if skillName then
|
contrebasse@0
|
81 local ID = A.link2ID(GetTradeSkillItemLink(i))
|
contrebasse@0
|
82 if ID and ID == itemID then
|
contrebasse@0
|
83 return i
|
contrebasse@0
|
84 end -- if
|
contrebasse@0
|
85 end -- if
|
contrebasse@0
|
86 end -- if
|
contrebasse@0
|
87 end -- for
|
contrebasse@0
|
88 A.DEBUG("Tradeskill not found")
|
contrebasse@0
|
89 end -- function
|
contrebasse@0
|
90 end -- do
|
contrebasse@0
|
91
|
contrebasse@0
|
92
|
contrebasse@0
|
93 -- http://www.wowwiki.com/RunSlashCmd
|
contrebasse@0
|
94 local _G = _G
|
contrebasse@0
|
95 function RunSlashCmd(cmd)
|
contrebasse@0
|
96 local slash, rest = cmd:match("^(%S+)%s*(.-)$")
|
contrebasse@0
|
97 for name, func in pairs(SlashCmdList) do
|
contrebasse@0
|
98 local i, slashCmd = 1
|
contrebasse@0
|
99 repeat
|
contrebasse@0
|
100 slashCmd, i = _G["SLASH_"..name..i], i + 1
|
contrebasse@0
|
101 if slashCmd == slash then
|
contrebasse@0
|
102 A.DEBUG("Spell found !")
|
contrebasse@0
|
103 return true, func(rest)
|
contrebasse@0
|
104 end
|
contrebasse@0
|
105 until not slashCmd
|
contrebasse@0
|
106 end
|
contrebasse@0
|
107 A.DEBUG("Spell not found :(")
|
contrebasse@0
|
108 end
|
contrebasse@0
|
109
|
contrebasse@0
|
110 do
|
contrebasse@0
|
111 -- WoW functions
|
contrebasse@0
|
112 local DoTradeSkill = DoTradeSkill
|
contrebasse@0
|
113
|
contrebasse@0
|
114 local function SplitStack(owner,split)
|
contrebasse@0
|
115 DoTradeSkill(owner.ReagentMakerIndex,tonumber(split))
|
contrebasse@0
|
116 end
|
contrebasse@0
|
117
|
contrebasse@0
|
118 function A.craft(self,itemID, spell)
|
contrebasse@0
|
119 -- self is the menu entry
|
contrebasse@0
|
120 if spell then
|
contrebasse@0
|
121 CastSpellByName("Mouture")
|
contrebasse@0
|
122 RunSlashCmd(spell) --CastSpellByName(spell)
|
contrebasse@0
|
123 --RunSlashCmd("/use "..itemID) --CastSpellByName("/use "..itemID)
|
contrebasse@0
|
124 return
|
contrebasse@0
|
125 end
|
contrebasse@0
|
126 local index = A.findSkillIndex(itemID)
|
contrebasse@0
|
127 if index then
|
contrebasse@0
|
128 local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(index)
|
contrebasse@0
|
129 if IsShiftKeyDown() and numAvailable>1 and not spell then
|
contrebasse@0
|
130 if not self.SplitStack then
|
contrebasse@0
|
131 self.SplitStack = SplitStack
|
contrebasse@0
|
132 end
|
contrebasse@0
|
133 self.ReagentMakerIndex = index
|
contrebasse@0
|
134
|
contrebasse@0
|
135 OpenStackSplitFrame(numAvailable, self, "TOPLEFT", "TOPRIGHT")
|
contrebasse@0
|
136 else
|
contrebasse@0
|
137 DoTradeSkill(index,1)
|
contrebasse@0
|
138 end
|
contrebasse@0
|
139 end
|
contrebasse@0
|
140 end -- function
|
contrebasse@0
|
141 end -- do
|
contrebasse@0
|
142
|
contrebasse@0
|
143
|
contrebasse@0
|
144 ---------------------------------------------------
|
contrebasse@0
|
145 -- Manage the popup menu
|
contrebasse@0
|
146 ---------------------------------------------------
|
contrebasse@0
|
147 do
|
contrebasse@0
|
148 -- Lua functions
|
contrebasse@0
|
149 local tonumber = tonumber
|
contrebasse@0
|
150
|
contrebasse@0
|
151 -- WoW functions
|
contrebasse@0
|
152 local IsModifierKeyDown = IsModifierKeyDown
|
contrebasse@0
|
153 local GetTradeSkillReagentItemLink = GetTradeSkillReagentItemLink
|
contrebasse@0
|
154 local GetTradeSkillSelectionIndex = GetTradeSkillSelectionIndex
|
contrebasse@0
|
155 local ToggleDropDownMenu = ToggleDropDownMenu
|
contrebasse@0
|
156
|
contrebasse@0
|
157 -- Toggles the reagent's menu
|
contrebasse@0
|
158 function A:ToggleMenu(button, index)
|
contrebasse@0
|
159 -- We want no modifiers
|
contrebasse@0
|
160 if IsModifierKeyDown() then return end
|
contrebasse@0
|
161
|
contrebasse@0
|
162 local itemID = A.link2ID(GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), index))
|
contrebasse@0
|
163 if itemID and A.data[itemID] then
|
contrebasse@0
|
164 self.MenuFrame.ReagentMakerItemID = itemID
|
contrebasse@0
|
165 ToggleDropDownMenu(1, nil, A.MenuFrame, button,-4,0)
|
contrebasse@0
|
166 end -- if
|
contrebasse@0
|
167 end -- function
|
contrebasse@0
|
168 end -- do
|
contrebasse@0
|
169
|
contrebasse@0
|
170 do
|
contrebasse@0
|
171 -- Lua functions
|
contrebasse@0
|
172 local type = type
|
contrebasse@0
|
173
|
contrebasse@0
|
174 -- Wow functions
|
contrebasse@0
|
175 local GetItemInfo = GetItemInfo
|
contrebasse@0
|
176 local UIDropDownMenu_AddButton = UIDropDownMenu_AddButton
|
contrebasse@0
|
177
|
contrebasse@0
|
178 -- persistent vars
|
contrebasse@0
|
179 local Minfo = {notCheckable = true, func = A.craft}
|
contrebasse@0
|
180 local Tinfo = {notCheckable = true, isTitle = true}
|
contrebasse@0
|
181
|
contrebasse@0
|
182 -- function to define the menu items
|
contrebasse@0
|
183 function A.FillMenu(self, level)
|
contrebasse@0
|
184 -- Title
|
contrebasse@0
|
185 local itemName, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(self.ReagentMakerItemID)
|
contrebasse@0
|
186 Tinfo.text = "Make "..link.." with:"
|
contrebasse@0
|
187 UIDropDownMenu_AddButton(Tinfo,level)
|
contrebasse@0
|
188
|
contrebasse@0
|
189 -- Loop over the availible reciepes
|
contrebasse@0
|
190 for spellID,reagents in pairs(A.data[self.ReagentMakerItemID]) do
|
contrebasse@0
|
191 --name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(itemID) or GetItemInfo("itemName") or GetItemInfo("itemLink")
|
contrebasse@0
|
192 -- Right now, manage only sub-recipes with only one reagent
|
contrebasse@0
|
193 if type(reagents[1]) == "number" then
|
contrebasse@0
|
194 local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(reagents[1])
|
contrebasse@0
|
195
|
contrebasse@0
|
196 if link then
|
contrebasse@0
|
197 Minfo.text = "|T"..texture..":0|t "..link
|
contrebasse@0
|
198 if #reagents>1 and reagents[2] > 1 then
|
contrebasse@0
|
199 Minfo.text = reagents[2].."x "..Minfo.text
|
contrebasse@0
|
200 end -- if
|
contrebasse@0
|
201
|
contrebasse@0
|
202 --if reagents.spell then
|
contrebasse@0
|
203 -- Minfo.func = RunMacroText
|
contrebasse@0
|
204 -- Minfo.arg1 = reagents.spell..itemName
|
contrebasse@0
|
205 -- Minfo.arg2 = nil
|
contrebasse@0
|
206 --else
|
contrebasse@0
|
207 Minfo.func = A.craft
|
contrebasse@0
|
208 Minfo.arg1 = self.ReagentMakerItemID
|
contrebasse@0
|
209 Minfo.arg2 = reagents.spell
|
contrebasse@0
|
210 --end -- if
|
contrebasse@0
|
211 UIDropDownMenu_AddButton(Minfo,level)
|
contrebasse@0
|
212 else
|
contrebasse@0
|
213 A.DEBUG("Erreur, objet inconnu :"..reagents[1])
|
contrebasse@0
|
214 end -- if
|
contrebasse@0
|
215 end -- if
|
contrebasse@0
|
216 end -- for
|
contrebasse@0
|
217 end -- function
|
contrebasse@0
|
218 end -- do
|
contrebasse@0
|
219
|
contrebasse@0
|
220
|
contrebasse@0
|
221 ---------------------------------------------------
|
contrebasse@0
|
222 -- Manage the tradeskill window state
|
contrebasse@0
|
223 ---------------------------------------------------
|
contrebasse@0
|
224 function A:SaveState()
|
contrebasse@0
|
225 end
|
contrebasse@0
|
226
|
contrebasse@0
|
227 function A:SetState(state)
|
contrebasse@0
|
228 end
|
contrebasse@0
|
229
|
contrebasse@0
|
230 function A:ExpandAll()
|
contrebasse@0
|
231 end
|