Mercurial > wow > askmrrobot
comparison Shopping.lua @ 124:e31b02b24488
Updated for 8.0 pre-patch and BfA.
author | yellowfive |
---|---|
date | Tue, 17 Jul 2018 09:57:39 -0700 |
parents | f1da233629be |
children | 318c93e0cd6b |
comparison
equal
deleted
inserted
replaced
123:7a6364917f86 | 124:e31b02b24488 |
---|---|
57 if name then | 57 if name then |
58 QueryAuctionItems(name) | 58 QueryAuctionItems(name) |
59 end | 59 end |
60 end | 60 end |
61 | 61 |
62 | |
62 function Amr:ShowShopWindow() | 63 function Amr:ShowShopWindow() |
64 | |
63 if not _frameShop then | 65 if not _frameShop then |
64 _frameShop = AceGUI:Create("AmrUiFrame") | 66 _frameShop = AceGUI:Create("AmrUiFrame") |
65 _frameShop:SetStatusTable(Amr.db.profile.shopWindow) -- window position is remembered in db | 67 _frameShop:SetStatusTable(Amr.db.profile.shopWindow) -- window position is remembered in db |
66 _frameShop:SetCallback("OnClose", onShopFrameClose) | 68 _frameShop:SetCallback("OnClose", onShopFrameClose) |
67 _frameShop:SetLayout("None") | 69 _frameShop:SetLayout("None") |
74 local scale = tonumber(Amr.db.profile.options.uiScale) | 76 local scale = tonumber(Amr.db.profile.options.uiScale) |
75 _frameShop:SetScale(scale) | 77 _frameShop:SetScale(scale) |
76 end | 78 end |
77 | 79 |
78 local lbl = AceGUI:Create("AmrUiLabel") | 80 local lbl = AceGUI:Create("AmrUiLabel") |
81 _frameShop:AddChild(lbl) | |
79 lbl:SetWidth(400) | 82 lbl:SetWidth(400) |
80 lbl:SetFont(Amr.CreateFont("Bold", 28, Amr.Colors.White)) | 83 lbl:SetFont(Amr.CreateFont("Bold", 28, Amr.Colors.White)) |
81 lbl:SetText(L.ShopTitle) | 84 lbl:SetText(L.ShopTitle) |
82 lbl:SetWordWrap(false) | 85 lbl:SetWordWrap(false) |
83 lbl:SetJustifyH("CENTER") | 86 lbl:SetJustifyH("CENTER") |
84 lbl:SetPoint("TOP", _frameShop.content, "TOP", 0, 30) | 87 lbl:SetPoint("TOP", _frameShop.content, "TOP", 0, 30) |
85 _frameShop:AddChild(lbl) | |
86 | 88 |
87 lbl:SetCallback("OnMouseDown", function(widget) _frameShop:StartMove() end) | 89 lbl:SetCallback("OnMouseDown", function(widget) _frameShop:StartMove() end) |
88 lbl:SetCallback("OnMouseUp", function(widget) _frameShop:EndMove() end) | 90 lbl:SetCallback("OnMouseUp", function(widget) _frameShop:EndMove() end) |
89 | 91 |
90 -- player picker | 92 -- player picker |
91 _cboPlayers = AceGUI:Create("AmrUiDropDown") | 93 _cboPlayers = AceGUI:Create("AmrUiDropDown") |
92 _cboPlayers:SetWidth(400) | 94 _cboPlayers:SetWidth(400) |
95 _frameShop:AddChild(_cboPlayers) | |
93 _cboPlayers:SetPoint("TOPLEFT", _frameShop.content, "TOPLEFT", 0, -30) | 96 _cboPlayers:SetPoint("TOPLEFT", _frameShop.content, "TOPLEFT", 0, -30) |
94 _frameShop:AddChild(_cboPlayers) | |
95 | 97 |
96 -- spec pickers | 98 -- spec pickers |
97 _chk1 = AceGUI:Create("AmrUiCheckBox") | 99 _chk1 = AceGUI:Create("AmrUiCheckBox") |
98 _chk1:SetPoint("TOPLEFT", _cboPlayers.frame, "BOTTOMLEFT", 0, -20) | |
99 _chk1:SetUserData("spec", 1) | 100 _chk1:SetUserData("spec", 1) |
100 _chk1:SetCallback("OnClick", onSpecClick) | 101 _chk1:SetCallback("OnClick", onSpecClick) |
101 _frameShop:AddChild(_chk1) | 102 _frameShop:AddChild(_chk1) |
103 _chk1:SetPoint("TOPLEFT", _cboPlayers.frame, "BOTTOMLEFT", 0, -20) | |
102 | 104 |
103 _chk2 = AceGUI:Create("AmrUiCheckBox") | 105 _chk2 = AceGUI:Create("AmrUiCheckBox") |
104 _chk2:SetPoint("LEFT", _chk1.frame, "RIGHT", 30, 0) | |
105 _chk2:SetUserData("spec", 2) | 106 _chk2:SetUserData("spec", 2) |
106 _chk2:SetCallback("OnClick", onSpecClick) | 107 _chk2:SetCallback("OnClick", onSpecClick) |
107 _frameShop:AddChild(_chk2) | 108 _frameShop:AddChild(_chk2) |
109 _chk2:SetPoint("LEFT", _chk1.frame, "RIGHT", 30, 0) | |
108 | 110 |
109 _chk3 = AceGUI:Create("AmrUiCheckBox") | 111 _chk3 = AceGUI:Create("AmrUiCheckBox") |
110 _chk3:SetPoint("LEFT", _chk2.frame, "RIGHT", 30, 0) | |
111 _chk3:SetUserData("spec", 3) | 112 _chk3:SetUserData("spec", 3) |
112 _chk3:SetCallback("OnClick", onSpecClick) | 113 _chk3:SetCallback("OnClick", onSpecClick) |
113 _frameShop:AddChild(_chk3) | 114 _frameShop:AddChild(_chk3) |
115 _chk3:SetPoint("LEFT", _chk2.frame, "RIGHT", 30, 0) | |
114 | 116 |
115 _chk4 = AceGUI:Create("AmrUiCheckBox") | 117 _chk4 = AceGUI:Create("AmrUiCheckBox") |
116 _chk4:SetPoint("LEFT", _chk3.frame, "RIGHT", 30, 0) | |
117 _chk4:SetUserData("spec", 4) | 118 _chk4:SetUserData("spec", 4) |
118 _chk4:SetCallback("OnClick", onSpecClick) | 119 _chk4:SetCallback("OnClick", onSpecClick) |
119 _frameShop:AddChild(_chk4) | 120 _frameShop:AddChild(_chk4) |
121 _chk4:SetPoint("LEFT", _chk3.frame, "RIGHT", 30, 0) | |
120 | 122 |
121 _panelContent = AceGUI:Create("AmrUiPanel") | 123 _panelContent = AceGUI:Create("AmrUiPanel") |
122 _panelContent:SetLayout("None") | 124 _panelContent:SetLayout("None") |
123 _panelContent:SetTransparent() | 125 _panelContent:SetTransparent() |
126 _frameShop:AddChild(_panelContent) | |
124 _panelContent:SetPoint("TOPLEFT", _chk1.frame, "BOTTOMLEFT", 0, -10) | 127 _panelContent:SetPoint("TOPLEFT", _chk1.frame, "BOTTOMLEFT", 0, -10) |
125 _panelContent:SetPoint("BOTTOMRIGHT", _frameShop.content, "BOTTOMRIGHT") | 128 _panelContent:SetPoint("BOTTOMRIGHT", _frameShop.content, "BOTTOMRIGHT") |
126 _frameShop:AddChild(_panelContent) | |
127 | 129 |
128 -- update shopping list data | 130 -- update shopping list data |
129 local player = Amr:ExportCharacter() | 131 local player = Amr:ExportCharacter() |
130 Amr:UpdateShoppingData(player) | 132 Amr:UpdateShoppingData(player) |
131 | 133 |
166 panel:SetWidth(w) | 168 panel:SetWidth(w) |
167 panel:SetHeight(40) | 169 panel:SetHeight(40) |
168 scroll:AddChild(panel) | 170 scroll:AddChild(panel) |
169 | 171 |
170 local lbl = AceGUI:Create("AmrUiLabel") | 172 local lbl = AceGUI:Create("AmrUiLabel") |
173 panel:AddChild(lbl) | |
171 lbl:SetWidth(w) | 174 lbl:SetWidth(w) |
172 lbl:SetFont(Amr.CreateFont("Regular", 18, Amr.Colors.TextHeaderActive)) | 175 lbl:SetFont(Amr.CreateFont("Regular", 18, Amr.Colors.TextHeaderActive)) |
173 lbl:SetText(header) | 176 lbl:SetText(header) |
174 lbl:SetPoint("BOTTOMLEFT", panel.content, "BOTTOMLEFT") | 177 lbl:SetPoint("BOTTOMLEFT", panel.content, "BOTTOMLEFT") |
175 panel:AddChild(lbl) | |
176 | 178 |
177 for itemId, count in pairs(list) do | 179 for itemId, count in pairs(list) do |
178 panel = AceGUI:Create("AmrUiPanel") | 180 panel = AceGUI:Create("AmrUiPanel") |
179 panel:SetLayout("None") | 181 panel:SetLayout("None") |
180 panel:SetTransparent() | 182 panel:SetTransparent() |
181 panel:SetWidth(w) | 183 panel:SetWidth(w) |
182 panel:SetHeight(30) | 184 panel:SetHeight(30) |
183 scroll:AddChild(panel) | 185 scroll:AddChild(panel) |
184 | 186 |
185 lbl = AceGUI:Create("AmrUiLabel") | 187 lbl = AceGUI:Create("AmrUiLabel") |
188 panel:AddChild(lbl) | |
186 lbl:SetWidth(40) | 189 lbl:SetWidth(40) |
187 lbl:SetWordWrap(false) | 190 lbl:SetWordWrap(false) |
188 lbl:SetFont(Amr.CreateFont("Bold", 20, Amr.Colors.White)) | 191 lbl:SetFont(Amr.CreateFont("Bold", 20, Amr.Colors.White)) |
189 lbl:SetText(count .. "x") | 192 lbl:SetText(count .. "x") |
190 lbl:SetPoint("LEFT", panel.content, "LEFT") | 193 lbl:SetPoint("LEFT", panel.content, "LEFT") |
191 panel:AddChild(lbl) | |
192 | 194 |
193 local icon = AceGUI:Create("AmrUiIcon") | 195 local icon = AceGUI:Create("AmrUiIcon") |
194 icon:SetBorderWidth(1) | 196 icon:SetBorderWidth(1) |
195 icon:SetIconBorderColor(Amr.Colors.White) | 197 icon:SetIconBorderColor(Amr.Colors.White) |
196 icon:SetWidth(18) | 198 icon:SetWidth(18) |
197 icon:SetHeight(18) | 199 icon:SetHeight(18) |
200 panel:AddChild(icon) | |
198 icon:SetPoint("LEFT", lbl.frame, "RIGHT", 5, 0) | 201 icon:SetPoint("LEFT", lbl.frame, "RIGHT", 5, 0) |
199 panel:AddChild(icon) | |
200 | 202 |
201 local btn = AceGUI:Create("AmrUiTextButton") | 203 local btn = AceGUI:Create("AmrUiTextButton") |
202 btn:SetWidth(w - 30 - 18 - 15) | 204 btn:SetWidth(w - 30 - 18 - 15) |
203 btn:SetJustifyH("LEFT") | 205 btn:SetJustifyH("LEFT") |
204 btn:SetWordWrap(false) | 206 btn:SetWordWrap(false) |
205 btn:SetFont(Amr.CreateFont("Bold", 14, Amr.Colors.White)) | 207 btn:SetFont(Amr.CreateFont("Bold", 14, Amr.Colors.White)) |
206 btn:SetHoverFont(Amr.CreateFont("Bold", 14, Amr.Colors.White)) | 208 btn:SetHoverFont(Amr.CreateFont("Bold", 14, Amr.Colors.White)) |
207 btn:SetPoint("LEFT", icon.frame, "RIGHT", 5, 0) | |
208 btn:SetCallback("OnClick", onItemClick) | 209 btn:SetCallback("OnClick", onItemClick) |
209 panel:AddChild(btn) | 210 panel:AddChild(btn) |
211 btn:SetPoint("LEFT", icon.frame, "RIGHT", 5, 0) | |
210 | 212 |
211 Amr.GetItemInfo(itemId, function(obj, name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture) | 213 Amr.GetItemInfo(itemId, function(obj, name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture) |
212 -- set icon, name, and a tooltip | 214 -- set icon, name, and a tooltip |
213 obj.itemIcon:SetIcon(texture) | 215 obj.itemIcon:SetIcon(texture) |
214 obj.itemText:SetText(link:gsub("%[", ""):gsub("%]", "")) | 216 obj.itemText:SetText(link:gsub("%[", ""):gsub("%]", "")) |
226 local list = Amr.db.char.BagItemsAndCounts | 228 local list = Amr.db.char.BagItemsAndCounts |
227 if list and list[itemId] then | 229 if list and list[itemId] then |
228 ret = ret + list[itemId] | 230 ret = ret + list[itemId] |
229 end | 231 end |
230 | 232 |
231 list = Amr.db.char.BankItemsAndCounts | 233 local bankBags = Amr.db.char.BankItemsAndCounts |
232 if list and list[itemId] then | 234 if bankBags then |
233 ret = ret + list[itemId] | 235 for bagId,bagList in pairs(bankBags) do |
236 if bagList[itemId] then | |
237 ret = ret + bagList[itemId] | |
238 end | |
239 end | |
234 end | 240 end |
235 | 241 |
236 return ret | 242 return ret |
237 end | 243 end |
238 | 244 |
277 local data = Amr.db.global.Shopping[_selectedPlayer] | 283 local data = Amr.db.global.Shopping[_selectedPlayer] |
278 if not data then | 284 if not data then |
279 _panelContent:SetLayout("None") | 285 _panelContent:SetLayout("None") |
280 | 286 |
281 local lbl = AceGUI:Create("AmrUiLabel") | 287 local lbl = AceGUI:Create("AmrUiLabel") |
288 _panelContent:AddChild(lbl) | |
282 lbl:SetFont(Amr.CreateFont("Italic", 18, Amr.Colors.TextTan)) | 289 lbl:SetFont(Amr.CreateFont("Italic", 18, Amr.Colors.TextTan)) |
283 lbl:SetText(L.ShopEmpty) | 290 lbl:SetText(L.ShopEmpty) |
284 lbl:SetJustifyH("CENTER") | 291 lbl:SetJustifyH("CENTER") |
285 lbl:SetPoint("TOP", _panelContent.content, "TOP", 0, -30) | 292 lbl:SetPoint("TOP", _panelContent.content, "TOP", 0, -30) |
286 _panelContent:AddChild(lbl) | |
287 else | 293 else |
288 local allStuff = { gems = {}, enchants = {}, materials = {} } | 294 local allStuff = { gems = {}, enchants = {}, materials = {} } |
289 local hasStuff = false | 295 local hasStuff = false |
290 local visited = {} | 296 local visited = {} |
291 | 297 |
352 end | 358 end |
353 end | 359 end |
354 | 360 |
355 end | 361 end |
356 | 362 |
357 -- compare gear to everything the player owns, and return the minimum gems/enchants/materials needed to optimize, grouped by inventory ID so that we can combine multiple specs without double-counting | 363 -- compare gear to everything the player owns, and return the minimum gems/enchants/materials needed to optimize, |
364 -- grouped by inventory ID so that we can combine multiple specs without double-counting | |
358 local function getShoppingData(player, gear, spec) | 365 local function getShoppingData(player, gear, spec) |
359 | 366 |
360 local ret = {} | 367 local ret = {} |
361 | 368 |
362 -- used to prevent considering the same item twice | 369 -- used to prevent considering the same item twice |
363 local usedItems = {} | 370 local usedItems = {} |
364 | 371 |
365 for slotId, optimalItem in pairs(gear) do | 372 for slotId, optimalItem in pairs(gear) do |
366 local matchItemLink, matchItem = Amr:FindMatchingItem(optimalItem, player, usedItems) | 373 local matchItem = Amr:FindMatchingItem(optimalItem, player, usedItems) |
367 local itemInfo = Amr.db.char.ExtraItemData[spec][optimalItem.id] | |
368 local inventoryId = optimalItem.inventoryId or -1 | 374 local inventoryId = optimalItem.inventoryId or -1 |
369 | 375 |
370 -- find gem/enchant differences on the best-matching item | 376 -- find gem/enchant differences on the best-matching item |
371 | 377 |
372 -- gems, but skip artifact relics (will have relicBonusIds set) | 378 -- gems |
373 if not optimalItem.relicBonusIds and itemInfo and itemInfo.socketColors then | 379 if not optimalItem.relicBonusIds and (not matchItem or not matchItem.relicBonusIds) then |
374 for i = 1, #itemInfo.socketColors do | 380 for i = 1, 3 do |
375 local g = optimalItem.gemIds[i] | 381 local g = optimalItem.gemIds[i] |
376 local isGemEquipped = g ~= 0 and matchItem and matchItem.gemIds and matchItem.gemIds[i] == g | 382 local isGemEquipped = g ~= 0 and matchItem and matchItem.gemIds and matchItem.gemIds[i] == g |
377 | 383 |
378 if not isGemEquipped then | 384 if not isGemEquipped then |
379 if not ret[inventoryId] then | 385 if not ret[inventoryId] then |
388 if optimalItem.enchantId and optimalItem.enchantId ~= 0 then | 394 if optimalItem.enchantId and optimalItem.enchantId ~= 0 then |
389 local e = optimalItem.enchantId | 395 local e = optimalItem.enchantId |
390 local isEnchantEquipped = matchItem and matchItem.enchantId and matchItem.enchantId == e | 396 local isEnchantEquipped = matchItem and matchItem.enchantId and matchItem.enchantId == e |
391 | 397 |
392 if not isEnchantEquipped then | 398 if not isEnchantEquipped then |
393 -- enchant info, look in all spec extra info cache | 399 -- enchant info |
394 local enchInfo = nil | 400 local enchInfo = Amr.db.char.ExtraEnchantData[e] |
395 for specPos = 1,4 do | |
396 if Amr.db.char.ExtraEnchantData[specPos] then | |
397 enchInfo = Amr.db.char.ExtraEnchantData[specPos][e] | |
398 if enchInfo then break end | |
399 end | |
400 end | |
401 | |
402 if enchInfo then | 401 if enchInfo then |
403 if not ret[inventoryId] then | 402 if not ret[inventoryId] then |
404 ret[inventoryId] = { gems = {}, enchants = {}, materials = {} } | 403 ret[inventoryId] = { gems = {}, enchants = {}, materials = {} } |
405 end | 404 end |
406 incrementTableItem(ret[inventoryId].enchants, enchInfo.itemId, 1) | 405 incrementTableItem(ret[inventoryId].enchants, enchInfo.itemId, 1) |
426 specs = player.Specs | 425 specs = player.Specs |
427 } | 426 } |
428 | 427 |
429 local enchantItemIdToId = {} | 428 local enchantItemIdToId = {} |
430 | 429 |
431 for spec, gear in pairs(Amr.db.char.GearSets) do | 430 for i, spec in ipairs(required.specs) do |
432 required.stuff[spec] = getShoppingData(player, gear, spec) | 431 local gear = Amr.db.char.GearSets[spec] |
432 if gear then | |
433 required.stuff[i] = getShoppingData(player, gear, spec) | |
434 else | |
435 required.stuff[i] = {} | |
436 end | |
433 end | 437 end |
434 | 438 |
435 Amr.db.global.Shopping[player.Name .. "-" .. player.Realm] = required | 439 Amr.db.global.Shopping[player.Name .. "-" .. player.Realm] = required |
436 end | 440 end |
437 | 441 |