Mercurial > wow > askmrrobot
comparison Gear.lua @ 89:6bbe64d587b4 v42
Improved artifact/relic reading, gear display.
Now creates equipment manager sets when you use button or command to equip a set.
author | yellowfive |
---|---|
date | Sun, 18 Sep 2016 21:24:08 -0700 |
parents | fe0bc2f32851 |
children | b8e9664d3229 |
comparison
equal
deleted
inserted
replaced
88:b3ff336fad77 | 89:6bbe64d587b4 |
---|---|
219 if optimalItemLink then | 219 if optimalItemLink then |
220 Amr.GetItemInfo(optimalItemLink, function(obj, name, link, quality, iLevel) | 220 Amr.GetItemInfo(optimalItemLink, function(obj, name, link, quality, iLevel) |
221 -- set item name, tooltip, and ilvl | 221 -- set item name, tooltip, and ilvl |
222 obj.nameLabel:SetText(link:gsub("%[", ""):gsub("%]", "")) | 222 obj.nameLabel:SetText(link:gsub("%[", ""):gsub("%]", "")) |
223 Amr:SetItemTooltip(obj.nameLabel, link) | 223 Amr:SetItemTooltip(obj.nameLabel, link) |
224 obj.ilvlLabel:SetText(iLevel) | 224 |
225 -- the game's info gives the wrong item level, so we have to scan for it | |
226 iLevel = (quality ~= 6 or optimalItem.relicBonusIds) and Amr.GetItemLevel(nil, nil, link) or "" | |
227 obj.ilvlLabel:SetText(iLevel) | |
228 | |
225 end, { ilvlLabel = lblIlvl, nameLabel = lblItem }) | 229 end, { ilvlLabel = lblIlvl, nameLabel = lblItem }) |
226 end | 230 end |
227 | 231 |
228 -- modifications | 232 -- modifications |
229 if optimalItem then | 233 if optimalItem then |
230 local itemInfo = Amr.db.char.ExtraItemData[spec][optimalItem.id] | 234 local itemInfo = Amr.db.char.ExtraItemData[spec][optimalItem.id] |
231 | 235 |
232 -- gems | 236 -- gems |
233 if itemInfo and itemInfo.socketColors then | 237 if itemInfo and itemInfo.socketColors then |
238 local prevSocket = nil | |
234 for i = 1, #itemInfo.socketColors do | 239 for i = 1, #itemInfo.socketColors do |
235 local g = optimalItem.gemIds[i] | 240 local g = optimalItem.gemIds[i] |
236 local isGemEquipped = g ~= 0 and matchItem and matchItem.gemIds and matchItem.gemIds[i] == g | 241 local isGemEquipped = g ~= 0 and matchItem and matchItem.gemIds and matchItem.gemIds[i] == g |
237 | 242 |
238 -- highlight for gem that doesn't match | 243 -- highlight for gem that doesn't match |
239 local socketBorder = AceGUI:Create("AmrUiPanel") | 244 local socketBorder = AceGUI:Create("AmrUiPanel") |
240 socketBorder:SetLayout("None") | 245 socketBorder:SetLayout("None") |
241 socketBorder:SetBackgroundColor(Amr.Colors.Black, isGemEquipped and 0 or 1) | 246 socketBorder:SetBackgroundColor(Amr.Colors.Black, isGemEquipped and 0 or 1) |
242 socketBorder:SetWidth(26) | 247 socketBorder:SetWidth(26) |
243 socketBorder:SetHeight(26) | 248 socketBorder:SetHeight(26) |
244 socketBorder:SetPoint("LEFT", lblItem.frame, "RIGHT", 30, 0) | 249 if not prevSocket then |
250 socketBorder:SetPoint("LEFT", lblItem.frame, "RIGHT", 30, 0) | |
251 else | |
252 socketBorder:SetPoint("LEFT", prevSocket.frame, "RIGHT", 2, 0) | |
253 end | |
245 if isGemEquipped then | 254 if isGemEquipped then |
246 socketBorder:SetAlpha(0.3) | 255 socketBorder:SetAlpha(0.3) |
247 end | 256 end |
248 panelMods:AddChild(socketBorder) | 257 panelMods:AddChild(socketBorder) |
249 | 258 |
266 | 275 |
267 -- get icon for optimized gem | 276 -- get icon for optimized gem |
268 if g ~= 0 then | 277 if g ~= 0 then |
269 local gemInfo = Amr.db.char.ExtraGemData[spec][g] | 278 local gemInfo = Amr.db.char.ExtraGemData[spec][g] |
270 if gemInfo then | 279 if gemInfo then |
271 Amr.GetItemInfo(gemInfo.id, function(obj, name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture) | 280 local gident = gemInfo.id |
281 if optimalItem.relicBonusIds then | |
282 gident = Amr.CreateItemLink({ id = gemInfo.id, enchantId = 0, gemIds = {0,0,0,0}, suffixId = 0, bonusIds = optimalItem.relicBonusIds[i]}) | |
283 end | |
284 Amr.GetItemInfo(gident, function(obj, name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture) | |
272 -- set icon and a tooltip | 285 -- set icon and a tooltip |
273 obj:SetIcon(texture) | 286 obj:SetIcon(texture) |
274 Amr:SetItemTooltip(obj, link) | 287 Amr:SetItemTooltip(obj, link) |
275 end, socketIcon) | 288 end, socketIcon) |
276 end | 289 end |
277 end | 290 end |
291 | |
292 prevSocket = socketBorder | |
278 end | 293 end |
279 end | 294 end |
280 | 295 |
281 -- enchant | 296 -- enchant |
282 if optimalItem.enchantId and optimalItem.enchantId ~= 0 then | 297 if optimalItem.enchantId and optimalItem.enchantId ~= 0 then |
376 t:SetPoint("TOPLEFT", container.content, "TOPLEFT", 144, -30) | 391 t:SetPoint("TOPLEFT", container.content, "TOPLEFT", 144, -30) |
377 t:SetPoint("BOTTOMRIGHT", container.content, "BOTTOMRIGHT") | 392 t:SetPoint("BOTTOMRIGHT", container.content, "BOTTOMRIGHT") |
378 container:AddChild(t) | 393 container:AddChild(t) |
379 _gearTabs = t; | 394 _gearTabs = t; |
380 | 395 |
381 --[[ | |
382 local btnShop = AceGUI:Create("AmrUiButton") | 396 local btnShop = AceGUI:Create("AmrUiButton") |
383 btnShop:SetText(L.GearButtonShop) | 397 btnShop:SetText(L.GearButtonShop) |
384 btnShop:SetBackgroundColor(Amr.Colors.Blue) | 398 btnShop:SetBackgroundColor(Amr.Colors.Blue) |
385 btnShop:SetFont(Amr.CreateFont("Regular", 14, Amr.Colors.White)) | 399 btnShop:SetFont(Amr.CreateFont("Regular", 14, Amr.Colors.White)) |
386 btnShop:SetWidth(245) | 400 btnShop:SetWidth(245) |
387 btnShop:SetHeight(26) | 401 btnShop:SetHeight(26) |
388 btnShop:SetPoint("TOPRIGHT", container.content, "TOPRIGHT", -20, -25) | 402 btnShop:SetPoint("TOPRIGHT", container.content, "TOPRIGHT", -20, -25) |
389 btnShop:SetCallback("OnClick", function(widget) Amr:ShowShopWindow() end) | 403 btnShop:SetCallback("OnClick", function(widget) Amr:ShowShopWindow() end) |
390 container:AddChild(btnShop) | 404 container:AddChild(btnShop) |
391 ]] | |
392 | 405 |
393 if not _activeTab then | 406 if not _activeTab then |
394 _activeTab = tostring(GetSpecialization()) | 407 _activeTab = tostring(GetSpecialization()) |
395 end | 408 end |
396 | 409 |
421 -- Gear Set Management | 434 -- Gear Set Management |
422 ------------------------------------------------------------------------------------------------ | 435 ------------------------------------------------------------------------------------------------ |
423 local _waitingForSpec = 0 | 436 local _waitingForSpec = 0 |
424 local _waitingForItemLock = nil | 437 local _waitingForItemLock = nil |
425 local _pendingEquip = nil | 438 local _pendingEquip = nil |
439 local _pendingRemove = nil | |
426 | 440 |
427 -- scan a bag for the best matching item | 441 -- scan a bag for the best matching item |
428 local function scanBagForItem(item, bagId, bestItem, bestDiff, bestLink) | 442 local function scanBagForItem(item, bagId, bestItem, bestDiff, bestLink) |
429 local numSlots = GetContainerNumSlots(bagId) | 443 local numSlots = GetContainerNumSlots(bagId) |
430 for slotId = 1, numSlots do | 444 for slotId = 1, numSlots do |
443 end | 457 end |
444 end | 458 end |
445 return bestItem, bestDiff, bestLink | 459 return bestItem, bestDiff, bestLink |
446 end | 460 end |
447 | 461 |
462 local function onEquipGearSetComplete() | |
463 -- create an equipment manager set | |
464 local specId, specName = GetSpecializationInfo(GetSpecialization()) | |
465 | |
466 local item = Amr.ParseItemLink(GetInventoryItemLink("player", INVSLOT_MAINHAND)) | |
467 if not item or not Amr.ArtifactIdToSpecNumber[item.id] then | |
468 item = Amr.ParseItemLink(GetInventoryItemLink("player", INVSLOT_OFFHAND)) | |
469 if item and not Amr.ArtifactIdToSpecNumber[item.id] then | |
470 item = nil | |
471 end | |
472 end | |
473 if item then | |
474 Amr.GetItemInfo(item.id, function(customArg, name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture) | |
475 SaveEquipmentSet("AMR " .. specName, texture) | |
476 end) | |
477 end | |
478 end | |
479 | |
448 -- find the first empty slot in the player's backpack+bags | 480 -- find the first empty slot in the player's backpack+bags |
449 local function findFirstEmptyBagSlot() | 481 local function findFirstEmptyBagSlot() |
450 | 482 |
451 local bagIds = {} | 483 local bagIds = {} |
452 table.insert(bagIds, BACKPACK_CONTAINER) | 484 table.insert(bagIds, BACKPACK_CONTAINER) |
582 end | 614 end |
583 end | 615 end |
584 | 616 |
585 end | 617 end |
586 | 618 |
619 local function removeNextItem() | |
620 if not _pendingRemove then return end | |
621 | |
622 local list = _pendingRemove.slotsToRemove | |
623 local slot = list[#list - _pendingRemove.remaining + 1] | |
624 | |
625 -- find first empty bag slot | |
626 local invBag, invSlot = findFirstEmptyBagSlot() | |
627 if not invBag then | |
628 -- stop if bags are too full | |
629 Amr:Print(L.GearEquipErrorBagFull) | |
630 _pendingRemove = nil | |
631 _pendingEquip = nil | |
632 return | |
633 end | |
634 | |
635 PickupInventoryItem(slot) | |
636 PickupContainerItem(invBag, invSlot) | |
637 | |
638 -- set flag so that when we clear cursor and release the item lock, we can respond to the event and continue | |
639 _waitingForItemLock = { | |
640 bagId = invBag, | |
641 slotId = invSlot, | |
642 isRemove = true | |
643 } | |
644 | |
645 ClearCursor() | |
646 end | |
647 | |
587 local function onItemUnlocked(bagId, slotId) | 648 local function onItemUnlocked(bagId, slotId) |
588 | 649 |
589 if _waitingForItemLock then | 650 if _waitingForItemLock then |
590 -- waiting on a move from bank to bags to complete, just continue as normal afterwards | 651 -- waiting on a move from bank to bags to complete, or waiting on removing an item to complete, just continue as normal afterwards |
591 if bagId == _waitingForItemLock.bagId and slotId == _waitingForItemLock.slotId then | 652 if bagId == _waitingForItemLock.bagId and slotId == _waitingForItemLock.slotId then |
653 local isremove = _waitingForItemLock.isRemove | |
592 _waitingForItemLock = nil | 654 _waitingForItemLock = nil |
593 tryEquipNextItem() | 655 |
656 if isremove then | |
657 _pendingRemove.remaining = _pendingRemove.remaining - 1 | |
658 if _pendingRemove.remaining > 0 then | |
659 removeNextItem() | |
660 else | |
661 -- we have removed all items that we want to remove, now do the equip | |
662 _pendingRemove = nil | |
663 tryEquipNextItem() | |
664 end | |
665 else | |
666 tryEquipNextItem() | |
667 end | |
594 end | 668 end |
595 | 669 |
596 elseif _pendingEquip and _pendingEquip.destSlot then | 670 elseif _pendingEquip and _pendingEquip.destSlot then |
597 -- waiting on an item swap to complete successfully so that we can go on to the next item | 671 -- waiting on an item swap to complete successfully so that we can go on to the next item |
598 | 672 |
679 end | 753 end |
680 end | 754 end |
681 end | 755 end |
682 | 756 |
683 if remaining > 0 then | 757 if remaining > 0 then |
758 -- if this is not our first try, then remove weapons before starting | |
759 local toRemove = {} | |
760 local removesRemaining = 0 | |
761 if _pendingEquip and _pendingEquip.tries > 0 then | |
762 for slotId, item in pairs(itemsToEquip) do | |
763 if slotId == 16 or slotId == 17 then | |
764 table.insert(toRemove, slotId) | |
765 removesRemaining = removesRemaining + 1 | |
766 end | |
767 end | |
768 end | |
769 | |
684 _pendingEquip = { | 770 _pendingEquip = { |
685 tries = _pendingEquip and _pendingEquip.spec == spec and _pendingEquip.tries or 0, | 771 tries = _pendingEquip and _pendingEquip.spec == spec and _pendingEquip.tries or 0, |
686 spec = spec, | 772 spec = spec, |
687 itemsToEquip = itemsToEquip, | 773 itemsToEquip = itemsToEquip, |
688 remaining = remaining, | 774 remaining = remaining, |
694 for slotId, item in pairs(_pendingEquip.itemsToEquip) do | 780 for slotId, item in pairs(_pendingEquip.itemsToEquip) do |
695 _pendingEquip.nextSlot = slotId | 781 _pendingEquip.nextSlot = slotId |
696 break | 782 break |
697 end | 783 end |
698 | 784 |
699 tryEquipNextItem() | 785 if removesRemaining > 0 then |
786 _pendingRemove = { | |
787 slotsToRemove = toRemove, | |
788 remaining = removesRemaining | |
789 } | |
790 removeNextItem() | |
791 else | |
792 tryEquipNextItem() | |
793 end | |
700 else | 794 else |
701 _pendingEquip = nil | 795 _pendingEquip = nil |
796 onEquipGearSetComplete() | |
702 end | 797 end |
703 end | 798 end |
704 | 799 |
705 local function onActiveTalentGroupChanged() | 800 local function onActiveTalentGroupChanged() |
706 | 801 |