Mercurial > wow > askmrrobot
comparison Junk.lua @ 161:35612aee8e15
Added junk list.
| author | yellowfive |
|---|---|
| date | Mon, 06 May 2019 14:08:03 -0700 |
| parents | |
| children | f66108c1f674 |
comparison
equal
deleted
inserted
replaced
| 160:d670336e8c89 | 161:35612aee8e15 |
|---|---|
| 1 local Amr = LibStub("AceAddon-3.0"):GetAddon("AskMrRobot") | |
| 2 local L = LibStub("AceLocale-3.0"):GetLocale("AskMrRobot", true) | |
| 3 local AceGUI = LibStub("AceGUI-3.0") | |
| 4 | |
| 5 local _frameJunk | |
| 6 local _lblAction | |
| 7 local _lblBank | |
| 8 local _btnBank | |
| 9 local _panelContent | |
| 10 | |
| 11 local _canDisenchant = false | |
| 12 local _isScrapOpen = false | |
| 13 local _isMerchantOpen = false | |
| 14 local _isBankOpen = false | |
| 15 | |
| 16 -- | |
| 17 -- Scan a bag for the specified item, returning the first exact match found | |
| 18 -- | |
| 19 local function scanBag(bagId, matchItem, usedItems) | |
| 20 | |
| 21 local numSlots = GetContainerNumSlots(bagId) | |
| 22 local loc = ItemLocation.CreateEmpty() | |
| 23 | |
| 24 if not usedItems[bagId] then | |
| 25 usedItems[bagId] = {} | |
| 26 end | |
| 27 | |
| 28 for slotId = 1, numSlots do | |
| 29 if not usedItems[bagId][slotId] then | |
| 30 local _, itemCount, _, _, _, _, itemLink = GetContainerItemInfo(bagId, slotId) | |
| 31 if itemLink ~= nil then | |
| 32 local itemData = Amr.Serializer.ParseItemLink(itemLink) | |
| 33 if itemData ~= nil then | |
| 34 -- see if this is an azerite item and read azerite power ids | |
| 35 loc:SetBagAndSlot(bagId, slotId) | |
| 36 if C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItem(loc) then | |
| 37 local powers = Amr.ReadAzeritePowers(loc) | |
| 38 if powers then | |
| 39 itemData.azerite = powers | |
| 40 end | |
| 41 end | |
| 42 | |
| 43 -- see if it matches | |
| 44 if Amr.CountItemDifferences(matchItem, itemData) == 0 then | |
| 45 usedItems[bagId][slotId] = true | |
| 46 itemData.bagId = bagId | |
| 47 itemData.slotId = slotId | |
| 48 return itemData | |
| 49 end | |
| 50 end | |
| 51 end | |
| 52 end | |
| 53 end | |
| 54 | |
| 55 return nil | |
| 56 end | |
| 57 | |
| 58 -- | |
| 59 -- Find a matching item in the player's bags | |
| 60 -- | |
| 61 local function findMatchingBagItem(item, usedItems) | |
| 62 | |
| 63 local matchItem = scanBag(BACKPACK_CONTAINER, item, usedItems) -- backpack | |
| 64 if not matchItem then | |
| 65 for bagId = 1, NUM_BAG_SLOTS do | |
| 66 matchItem = scanBag(bagId, item, usedItems) | |
| 67 if matchItem then break end | |
| 68 end | |
| 69 end | |
| 70 | |
| 71 return matchItem | |
| 72 end | |
| 73 | |
| 74 | |
| 75 -- | |
| 76 -- item actions | |
| 77 -- | |
| 78 local _deSpellName = GetSpellInfo(13262); | |
| 79 local _deMacro = "/stopmacro [combat][btn:2]\n/stopcasting\n/cast %s\n/use %s %s"; | |
| 80 | |
| 81 local function onItemPreClick(widget) | |
| 82 | |
| 83 local item = widget:GetUserData("itemData") | |
| 84 | |
| 85 if item and _canDisenchant and (not _isScrapOpen and not _isMerchantOpen) then | |
| 86 -- only way i can find to disenchant and item on click is to call a macro, gross but works | |
| 87 local matchItem = findMatchingBagItem(item, {}) | |
| 88 if matchItem then | |
| 89 widget:SetMacroText(_deMacro:format(_deSpellName, matchItem.bagId, matchItem.slotId)) | |
| 90 else | |
| 91 widget:SetMacroText(nil) | |
| 92 Amr:Print(L.JunkItemNotFound) | |
| 93 end | |
| 94 else | |
| 95 widget:SetMacroText(nil) | |
| 96 end | |
| 97 end | |
| 98 | |
| 99 local function onItemClick(widget) | |
| 100 | |
| 101 local item = widget:GetUserData("itemData") | |
| 102 if not item then return end | |
| 103 | |
| 104 local action = nil | |
| 105 if _isScrapOpen then | |
| 106 action = "scrap" | |
| 107 elseif _isMerchantOpen then | |
| 108 action = "sell" | |
| 109 elseif _canDisenchant then | |
| 110 action = "disenchant" | |
| 111 end | |
| 112 | |
| 113 if not action then return end | |
| 114 | |
| 115 local matchItem = findMatchingBagItem(item, {}) | |
| 116 if matchItem then | |
| 117 if action == "scrap" then | |
| 118 UseContainerItem(matchItem.bagId, matchItem.slotId) | |
| 119 elseif action == "sell" then | |
| 120 UseContainerItem(matchItem.bagId, matchItem.slotId) | |
| 121 end | |
| 122 | |
| 123 -- note for disenchant, the macro has handled the action, this will simply remove the item from the list | |
| 124 | |
| 125 -- re-render the list with this item removed; | |
| 126 -- AceGUI doesn't give a good way to remove a ui element from a container and re-render, | |
| 127 -- so we sort of hack it and modify the collection of children directly, | |
| 128 -- avoids the expensive logic of finding and matching all the items when the list changes as a user sells stuff | |
| 129 local scroll = widget.parent.parent | |
| 130 local newChildren = {} | |
| 131 for i = 1, #scroll.children do | |
| 132 local child = scroll.children[i] | |
| 133 if child ~= widget.parent then | |
| 134 table.insert(newChildren, child) | |
| 135 end | |
| 136 end | |
| 137 scroll.children = newChildren | |
| 138 | |
| 139 -- dispose the item just removed, then re-render the list | |
| 140 widget.parent:Release() | |
| 141 widget.parent.parent:DoLayout() | |
| 142 else | |
| 143 Amr:Print(L.JunkItemNotFound) | |
| 144 end | |
| 145 end | |
| 146 | |
| 147 | |
| 148 -- | |
| 149 -- bank withdraw stuff | |
| 150 -- | |
| 151 local _bankUsedBagSlots = nil | |
| 152 local finishBankWithdraw | |
| 153 local doBankWithdraw | |
| 154 | |
| 155 finishBankWithdraw = function() | |
| 156 | |
| 157 local done = true | |
| 158 | |
| 159 if _isBankOpen and _bankUsedBagSlots then | |
| 160 for bagId,v in pairs(_bankUsedBagSlots) do | |
| 161 for slotId,v in pairs(v) do | |
| 162 local _, _, _, _, _, _, itemLink = GetContainerItemInfo(bagId, slotId) | |
| 163 if not itemLink then | |
| 164 done = false | |
| 165 break | |
| 166 end | |
| 167 end | |
| 168 if not done then break end | |
| 169 end | |
| 170 end | |
| 171 | |
| 172 if not done then | |
| 173 -- wait a second and try again | |
| 174 Amr.Wait(1, function() | |
| 175 doBankWithdraw() | |
| 176 end) | |
| 177 else | |
| 178 | |
| 179 print("bank withdraw done") | |
| 180 | |
| 181 -- reset state | |
| 182 _bankUsedBagSlots = nil | |
| 183 _btnBank:SetDisabled(not _isBankOpen) | |
| 184 | |
| 185 -- re-render the junk list | |
| 186 Amr:RefreshJunkUi() | |
| 187 end | |
| 188 end | |
| 189 | |
| 190 doBankWithdraw = function() | |
| 191 if not _isBankOpen then return end | |
| 192 | |
| 193 local data = Amr.db.char.JunkData | |
| 194 if not data.Junk then return end | |
| 195 | |
| 196 print("doing bank withdraw...") | |
| 197 | |
| 198 -- disable button while processing | |
| 199 _btnBank:SetDisabled(true) | |
| 200 | |
| 201 local bagList = {} | |
| 202 table.insert(bagList, BANK_CONTAINER) | |
| 203 for bagId = NUM_BAG_SLOTS + 1, NUM_BAG_SLOTS + NUM_BANKBAGSLOTS do | |
| 204 table.insert(bagList, bagId) | |
| 205 end | |
| 206 | |
| 207 local usedItems = {} | |
| 208 _bankUsedBagSlots = {} | |
| 209 | |
| 210 for i,item in ipairs(data.Junk) do | |
| 211 -- stop immediately if the bank is closed | |
| 212 if not _isBankOpen then | |
| 213 finishBankWithdraw() | |
| 214 return | |
| 215 end | |
| 216 | |
| 217 -- check if already in bags | |
| 218 local matchItem = findMatchingBagItem(item, usedItems) | |
| 219 if not matchItem then | |
| 220 -- find it in the bank | |
| 221 for j = 1, #bagList do | |
| 222 matchItem = scanBag(bagList[j], item, usedItems) | |
| 223 if matchItem then break end | |
| 224 end | |
| 225 else | |
| 226 matchItem = nil | |
| 227 end | |
| 228 | |
| 229 if matchItem then | |
| 230 -- move it to the player's bags if there is space | |
| 231 local bagId, slotId = Amr.FindFirstEmptyBagSlot(_bankUsedBagSlots) | |
| 232 if bagId then | |
| 233 UseContainerItem(matchItem.bagId, matchItem.slotId) | |
| 234 else | |
| 235 -- no more empty bag slots | |
| 236 break | |
| 237 end | |
| 238 end | |
| 239 end | |
| 240 | |
| 241 -- wait a second and see if all the moves actually finished | |
| 242 Amr.Wait(1, function() | |
| 243 finishBankWithdraw() | |
| 244 end) | |
| 245 end | |
| 246 | |
| 247 local function onBankClick() | |
| 248 if not _frameJunk or not _isBankOpen then return end | |
| 249 | |
| 250 doBankWithdraw() | |
| 251 end | |
| 252 | |
| 253 | |
| 254 local function onJunkFrameClose(widget) | |
| 255 AceGUI:Release(widget) | |
| 256 _frameJunk = nil | |
| 257 _lblAction = nil | |
| 258 _lblBank = nil | |
| 259 _btnBank = nil | |
| 260 _panelContent = nil | |
| 261 end | |
| 262 | |
| 263 function Amr:HideJunkWindow() | |
| 264 if not _frameJunk then return end | |
| 265 _frameJunk:Hide() | |
| 266 end | |
| 267 | |
| 268 function Amr:ShowJunkWindow() | |
| 269 | |
| 270 if not _frameJunk then | |
| 271 _frameJunk = AceGUI:Create("AmrUiFrame") | |
| 272 _frameJunk:SetStatusTable(Amr.db.profile.junkWindow) -- window position is remembered in db | |
| 273 _frameJunk:SetCallback("OnClose", onJunkFrameClose) | |
| 274 _frameJunk:SetLayout("None") | |
| 275 _frameJunk:SetWidth(400) | |
| 276 _frameJunk:SetHeight(700) | |
| 277 _frameJunk:SetBorderColor(Amr.Colors.BorderBlue) | |
| 278 _frameJunk:SetBackgroundColor(Amr.Colors.Bg) | |
| 279 | |
| 280 if Amr.db.profile.options.uiScale ~= 1 then | |
| 281 local scale = tonumber(Amr.db.profile.options.uiScale) | |
| 282 _frameJunk:SetScale(scale) | |
| 283 end | |
| 284 | |
| 285 local lbl = AceGUI:Create("AmrUiLabel") | |
| 286 _frameJunk:AddChild(lbl) | |
| 287 lbl:SetWidth(300) | |
| 288 lbl:SetFont(Amr.CreateFont("Bold", 28, Amr.Colors.White)) | |
| 289 lbl:SetText(L.JunkTitle) | |
| 290 lbl:SetWordWrap(false) | |
| 291 lbl:SetJustifyH("CENTER") | |
| 292 lbl:SetPoint("TOP", _frameJunk.content, "TOP", 0, 30) | |
| 293 lbl:SetCallback("OnMouseDown", function(widget) _frameJunk:StartMove() end) | |
| 294 lbl:SetCallback("OnMouseUp", function(widget) _frameJunk:EndMove() end) | |
| 295 | |
| 296 _lblAction = AceGUI:Create("AmrUiLabel") | |
| 297 _frameJunk:AddChild(_lblAction) | |
| 298 _lblAction:SetWidth(380) | |
| 299 _lblAction:SetFont(Amr.CreateFont("Regular", 14, Amr.Colors.TextTan)) | |
| 300 _lblAction:SetText(" ") | |
| 301 _lblAction:SetWordWrap(false) | |
| 302 _lblAction:SetPoint("TOPLEFT", _frameJunk.content, "TOPLEFT", 0, -10) | |
| 303 | |
| 304 _btnBank = AceGUI:Create("AmrUiButton") | |
| 305 _frameJunk:AddChild(_btnBank) | |
| 306 _btnBank:SetText(L.JunkButtonBank) | |
| 307 _btnBank:SetBackgroundColor(Amr.Colors.Green) | |
| 308 _btnBank:SetFont(Amr.CreateFont("Bold", 14, Amr.Colors.White)) | |
| 309 _btnBank:SetWidth(180) | |
| 310 _btnBank:SetHeight(26) | |
| 311 _btnBank:SetDisabled(true) | |
| 312 _btnBank:SetCallback("OnClick", onBankClick) | |
| 313 _btnBank:SetPoint("BOTTOMLEFT", _frameJunk.content, "BOTTOMLEFT") | |
| 314 | |
| 315 _lblBank = AceGUI:Create("AmrUiLabel") | |
| 316 _frameJunk:AddChild(_lblBank) | |
| 317 _lblBank:SetWidth(380) | |
| 318 _lblBank:SetFont(Amr.CreateFont("Bold", 15, Amr.Colors.TextHeaderActive)) | |
| 319 _lblBank:SetText(L.JunkBankText(0)) | |
| 320 _lblBank:SetPoint("BOTTOMLEFT", _btnBank.frame, "TOPLEFT", 0, 10) | |
| 321 | |
| 322 local line = AceGUI:Create("AmrUiPanel") | |
| 323 _frameJunk:AddChild(line) | |
| 324 line:SetHeight(1) | |
| 325 line:SetBackgroundColor(Amr.Colors.White) | |
| 326 line:SetPoint("TOPLEFT", _frameJunk.content, "TOPLEFT", 0, -30) | |
| 327 line:SetPoint("TOPRIGHT", _frameJunk.content, "TOPRIGHT", 0, -30) | |
| 328 | |
| 329 line = AceGUI:Create("AmrUiPanel") | |
| 330 _frameJunk:AddChild(line) | |
| 331 line:SetHeight(1) | |
| 332 line:SetBackgroundColor(Amr.Colors.White) | |
| 333 line:SetPoint("TOPLEFT", _frameJunk.content, "BOTTOMLEFT", 0, 60) | |
| 334 line:SetPoint("TOPRIGHT", _frameJunk.content, "BOTTOMRIGHT", 0, 60) | |
| 335 | |
| 336 _panelContent = AceGUI:Create("AmrUiPanel") | |
| 337 _panelContent:SetLayout("None") | |
| 338 _panelContent:SetTransparent() | |
| 339 _frameJunk:AddChild(_panelContent) | |
| 340 _panelContent:SetPoint("TOPLEFT", _frameJunk.content, "TOPLEFT", 0, -31) | |
| 341 _panelContent:SetPoint("BOTTOMRIGHT", _frameJunk.content, "BOTTOMRIGHT", 0, 60) | |
| 342 | |
| 343 | |
| 344 Amr:RefreshJunkUi() | |
| 345 else | |
| 346 _frameJunk:Show() | |
| 347 Amr:RefreshJunkUi() | |
| 348 end | |
| 349 | |
| 350 _frameJunk:Raise() | |
| 351 end | |
| 352 | |
| 353 local function canDisenchant() | |
| 354 | |
| 355 local prof1, prof2 = GetProfessions(); | |
| 356 local profs = {} | |
| 357 table.insert(profs, prof1) | |
| 358 table.insert(profs, prof2) | |
| 359 for i,prof in ipairs(profs) do | |
| 360 if prof then | |
| 361 local _, _, skillLevel, _, _, _, skillLine = GetProfessionInfo(prof); | |
| 362 if Amr.ProfessionSkillLineToName[skillLine] == "Enchanting" and skillLevel > 0 then | |
| 363 return true | |
| 364 end | |
| 365 end | |
| 366 end | |
| 367 | |
| 368 return false | |
| 369 end | |
| 370 | |
| 371 -- | |
| 372 -- Find a matching item that is not in the player's inventory (bank or equipped) | |
| 373 -- | |
| 374 local function findMatchingNonBagItem(matchItem, usedItems) | |
| 375 | |
| 376 local loc = ItemLocation.CreateEmpty() | |
| 377 | |
| 378 -- check equipped | |
| 379 local equippedBagId = -1000 | |
| 380 if not usedItems[equippedBagId] then | |
| 381 usedItems[equippedBagId] = {} | |
| 382 end | |
| 383 | |
| 384 for slotNum = 1, #Amr.SlotIds do | |
| 385 local slotId = Amr.SlotIds[slotNum] | |
| 386 if not usedItems[equippedBagId][slotId] then | |
| 387 local itemLink = GetInventoryItemLink("player", slotId) | |
| 388 if itemLink then | |
| 389 local itemData = Amr.ParseItemLink(itemLink) | |
| 390 if itemData then | |
| 391 -- see if this is an azerite item and read azerite power ids | |
| 392 loc:SetEquipmentSlot(slotId) | |
| 393 if C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItem(loc) then | |
| 394 local powers = Amr.ReadAzeritePowers(loc) | |
| 395 if powers then | |
| 396 itemData.azerite = powers | |
| 397 end | |
| 398 end | |
| 399 | |
| 400 -- see if it matches | |
| 401 if Amr.CountItemDifferences(matchItem, itemData) == 0 then | |
| 402 usedItems[equippedBagId][slotId] = true | |
| 403 itemData.bagId = bagId | |
| 404 itemData.slotId = slotId | |
| 405 return itemData | |
| 406 end | |
| 407 end | |
| 408 end | |
| 409 end | |
| 410 end | |
| 411 | |
| 412 -- check bank data | |
| 413 if Amr.db.char.BankItems then | |
| 414 for bagId, v in pairs(Amr.db.char.BankItems) do | |
| 415 if not usedItems[bagId] then | |
| 416 usedItems[bagId] = {} | |
| 417 end | |
| 418 | |
| 419 for i, itemData in ipairs(v) do | |
| 420 if itemData and not usedItems[bagId][i] then | |
| 421 -- see if it matches | |
| 422 if Amr.CountItemDifferences(matchItem, itemData) == 0 then | |
| 423 usedItems[bagId][i] = true | |
| 424 itemData.bagId = bagId | |
| 425 itemData.slotId = i | |
| 426 return itemData | |
| 427 end | |
| 428 end | |
| 429 end | |
| 430 end | |
| 431 end | |
| 432 | |
| 433 return nil | |
| 434 end | |
| 435 | |
| 436 local function renderItem(item, itemLink, scroll) | |
| 437 | |
| 438 local panel = AceGUI:Create("AmrUiPanel") | |
| 439 scroll:AddChild(panel) | |
| 440 panel:SetLayout("None") | |
| 441 panel:SetTransparent() | |
| 442 panel:SetWidth(380) | |
| 443 panel:SetHeight(40) | |
| 444 | |
| 445 -- ilvl label | |
| 446 local lblIlvl = AceGUI:Create("AmrUiLabel") | |
| 447 panel:AddChild(lblIlvl) | |
| 448 lblIlvl:SetPoint("LEFT", panel.content, "LEFT", 0, 0) | |
| 449 lblIlvl:SetWidth(35) | |
| 450 lblIlvl:SetFont(Amr.CreateFont("Italic", 13, Amr.Colors.TextTan)) | |
| 451 | |
| 452 -- icon | |
| 453 local icon = AceGUI:Create("AmrUiIcon") | |
| 454 panel:AddChild(icon) | |
| 455 icon:SetBorderWidth(1) | |
| 456 icon:SetIconBorderColor(Amr.Colors.White) | |
| 457 icon:SetWidth(28) | |
| 458 icon:SetHeight(28) | |
| 459 icon:SetPoint("LEFT", lblIlvl.frame, "RIGHT", 0, 0) | |
| 460 | |
| 461 -- item name/link label | |
| 462 local lblItem = AceGUI:Create("AmrUiTextButton") | |
| 463 panel:AddChild(lblItem) | |
| 464 lblItem:SetPoint("LEFT", icon.frame, "RIGHT", 0, 0) | |
| 465 lblItem:SetWordWrap(false) | |
| 466 lblItem:SetJustifyH("LEFT") | |
| 467 lblItem:SetWidth(300) | |
| 468 lblItem:SetHeight(28) | |
| 469 lblItem:SetFont(Amr.CreateFont("Regular", 13, Amr.Colors.White)) | |
| 470 lblItem:SetHoverBackgroundColor(Amr.Colors.Black, 0.3) | |
| 471 lblItem:SetTextPadding(0, 0, 0, 5) | |
| 472 lblItem:SetCallback("PreClick", onItemPreClick) | |
| 473 lblItem:SetCallback("OnClick", onItemClick) | |
| 474 lblItem:SetUserData("itemData", item) | |
| 475 | |
| 476 -- fill the name/ilvl labels, which may require asynchronous loading of item information | |
| 477 if itemLink then | |
| 478 local gameItem = Item:CreateFromItemLink(itemLink) | |
| 479 if gameItem then | |
| 480 local q = gameItem:GetItemQuality() | |
| 481 lblItem:SetFont(Amr.CreateFont("Regular", 13, Amr.Colors.Qualities[q] or Amr.Colors.White)) | |
| 482 lblItem:SetHoverFont(Amr.CreateFont("Regular", 13, Amr.Colors.Qualities[q] or Amr.Colors.White)) | |
| 483 lblItem:SetText(gameItem:GetItemName()) | |
| 484 lblIlvl:SetText(gameItem:GetCurrentItemLevel()) | |
| 485 icon:SetIconBorderColor(Amr.Colors.Qualities[q] or Amr.Colors.White) | |
| 486 icon:SetIcon(gameItem:GetItemIcon()) | |
| 487 Amr:SetItemTooltip(lblItem, gameItem:GetItemLink(), "ANCHOR_BOTTOMRIGHT", 0, 30) | |
| 488 end | |
| 489 end | |
| 490 | |
| 491 end | |
| 492 | |
| 493 -- | |
| 494 -- Just updates state without re-rendering the list of junk | |
| 495 -- | |
| 496 function Amr:SetJunkUiState() | |
| 497 | |
| 498 -- don't do anything if the window is not open | |
| 499 if not _frameJunk then return end | |
| 500 | |
| 501 -- cache whether the player can disenchant whenever the ui is refreshed | |
| 502 _canDisenchant = canDisenchant() | |
| 503 | |
| 504 -- update action label | |
| 505 if _isScrapOpen then | |
| 506 _lblAction:SetText(L.JunkScrap) | |
| 507 elseif _isMerchantOpen then | |
| 508 _lblAction:SetText(L.JunkVendor) | |
| 509 elseif _canDisenchant then | |
| 510 _lblAction:SetText(L.JunkDisenchant) | |
| 511 else | |
| 512 _lblAction:SetText(" ") | |
| 513 end | |
| 514 | |
| 515 -- update bank button state | |
| 516 _btnBank:SetDisabled(not _isBankOpen) | |
| 517 end | |
| 518 | |
| 519 -- | |
| 520 -- Refresh the entire UI, including re-rendering the junk list | |
| 521 -- | |
| 522 function Amr:RefreshJunkUi() | |
| 523 | |
| 524 -- don't do anything if the window is not open | |
| 525 if not _frameJunk then return end | |
| 526 | |
| 527 Amr:SetJunkUiState() | |
| 528 | |
| 529 -- clear out any previous data | |
| 530 _panelContent:ReleaseChildren() | |
| 531 | |
| 532 local data = Amr.db.char.JunkData | |
| 533 | |
| 534 if not data or not data.Junk or #data.Junk <= 0 then | |
| 535 local lbl = AceGUI:Create("AmrUiLabel") | |
| 536 _panelContent:AddChild(lbl) | |
| 537 lbl:SetFont(Amr.CreateFont("Italic", 16, Amr.Colors.TextGray)) | |
| 538 lbl:SetText(L.JunkEmpty) | |
| 539 lbl:SetPoint("TOPLEFT", _panelContent.content, "TOPLEFT", 0, -10) | |
| 540 _lblBank:SetVisible(false) | |
| 541 _btnBank:SetVisible(false) | |
| 542 else | |
| 543 | |
| 544 _panelContent:SetLayout("Fill") | |
| 545 | |
| 546 local scroll = AceGUI:Create("AmrUiScrollFrame") | |
| 547 scroll:SetLayout("List") | |
| 548 _panelContent:AddChild(scroll) | |
| 549 | |
| 550 -- render items currently in the player's inventory | |
| 551 local usedItems = {} | |
| 552 local bankCount = 0 | |
| 553 local missingCount = 0 | |
| 554 | |
| 555 -- if we have any "keep" items, those are exact duplicates of ones to be junked, | |
| 556 -- be sure to "reserve" those first | |
| 557 if data.Keep then | |
| 558 for uniqueId, item in pairs(data.Keep) do | |
| 559 -- check if an exact match is in the player's bank data or equipped | |
| 560 local matchItem = findMatchingNonBagItem(item, usedItems) | |
| 561 | |
| 562 -- if not, find one in the player's bags | |
| 563 if not matchItem then | |
| 564 matchItem = findMatchingBagItem(item, usedItems) | |
| 565 end | |
| 566 | |
| 567 if not matchItem then | |
| 568 -- abort, player's data must be out of sync | |
| 569 local lbl = AceGUI:Create("AmrUiLabel") | |
| 570 _panelContent:AddChild(lbl) | |
| 571 lbl:SetWidth(380) | |
| 572 lbl:SetFont(Amr.CreateFont("Italic", 13, Amr.Colors.TextGray)) | |
| 573 lbl:SetText(L.JunkOutOfSync) | |
| 574 lbl:SetPoint("TOPLEFT", _panelContent.content, "TOPLEFT", 0, -10) | |
| 575 | |
| 576 _lblBank:SetVisible(false) | |
| 577 _btnBank:SetVisible(false) | |
| 578 | |
| 579 return | |
| 580 end | |
| 581 end | |
| 582 end | |
| 583 | |
| 584 -- now render any junk items in the player's bags, and a count of how many are elsewhere (usually bank) | |
| 585 for i, item in ipairs(data.Junk) do | |
| 586 local matchItem = findMatchingBagItem(item, usedItems) | |
| 587 if matchItem then | |
| 588 local itemLink = Amr.CreateItemLink(matchItem) | |
| 589 renderItem(matchItem, itemLink, scroll) | |
| 590 else | |
| 591 -- see if it is in the bank or equipped | |
| 592 matchItem = findMatchingNonBagItem(item, usedItems) | |
| 593 if matchItem then | |
| 594 bankCount = bankCount + 1 | |
| 595 else | |
| 596 missingCount = missingCount + 1 | |
| 597 end | |
| 598 end | |
| 599 end | |
| 600 | |
| 601 _lblBank:SetText(L.JunkBankText(bankCount)) | |
| 602 _lblBank:SetVisible(bankCount > 0) | |
| 603 _btnBank:SetVisible(bankCount > 0) | |
| 604 | |
| 605 -- in most cases, this is because the user has sold/scrapped the items already | |
| 606 --if missingCount > 0 then | |
| 607 -- Amr:Print(L.JunkMissingText(missingCount)) | |
| 608 --end | |
| 609 end | |
| 610 end | |
| 611 | |
| 612 Amr:AddEventHandler("SCRAPPING_MACHINE_SHOW", function() | |
| 613 _isScrapOpen = true | |
| 614 if Amr.db.profile.options.junkVendor and Amr.db.char.JunkData and Amr.db.char.JunkData.Junk and #Amr.db.char.JunkData.Junk > 0 then | |
| 615 Amr:ShowJunkWindow() | |
| 616 else | |
| 617 Amr:SetJunkUiState() | |
| 618 end | |
| 619 end) | |
| 620 | |
| 621 Amr:AddEventHandler("SCRAPPING_MACHINE_CLOSE", function() | |
| 622 _isScrapOpen = false | |
| 623 if Amr.db.profile.options.junkVendor then | |
| 624 Amr:HideJunkWindow() | |
| 625 else | |
| 626 Amr:SetJunkUiState() | |
| 627 end | |
| 628 end) | |
| 629 | |
| 630 Amr:AddEventHandler("MERCHANT_SHOW", function() | |
| 631 _isMerchantOpen = true | |
| 632 if Amr.db.profile.options.junkVendor and Amr.db.char.JunkData and Amr.db.char.JunkData.Junk and #Amr.db.char.JunkData.Junk > 0 then | |
| 633 Amr:ShowJunkWindow() | |
| 634 else | |
| 635 Amr:SetJunkUiState() | |
| 636 end | |
| 637 end) | |
| 638 | |
| 639 Amr:AddEventHandler("MERCHANT_CLOSED", function() | |
| 640 _isMerchantOpen = false | |
| 641 if Amr.db.profile.options.junkVendor then | |
| 642 Amr:HideJunkWindow() | |
| 643 else | |
| 644 Amr:SetJunkUiState() | |
| 645 end | |
| 646 end) | |
| 647 | |
| 648 Amr:AddEventHandler("BANKFRAME_OPENED", function() | |
| 649 _isBankOpen = true | |
| 650 Amr:SetJunkUiState() | |
| 651 end) | |
| 652 | |
| 653 Amr:AddEventHandler("BANKFRAME_CLOSED", function() | |
| 654 _isBankOpen = false | |
| 655 Amr:SetJunkUiState() | |
| 656 end) |
