Mercurial > wow > askmrrobot
comparison Gear.lua @ 191:4aeedce4c995 v93
Added better identification of duplicate items.
author | yellowfive |
---|---|
date | Fri, 30 Oct 2020 21:14:57 -0700 |
parents | a7f2ba17c39a |
children | 4ccc9ff6e824 |
comparison
equal
deleted
inserted
replaced
190:4232d073a90b | 191:4aeedce4c995 |
---|---|
27 return 0 | 27 return 0 |
28 end | 28 end |
29 | 29 |
30 -- one nil and other not, or different id, totally different | 30 -- one nil and other not, or different id, totally different |
31 if (not item1 and item2) or (item1 and not item2) or item1.id ~= item2.id then | 31 if (not item1 and item2) or (item1 and not item2) or item1.id ~= item2.id then |
32 return 100000 | 32 return 1000000 |
33 end | 33 end |
34 | 34 |
35 -- different versions of same item (id + bonus ids + suffix + drop level, constitutes a different physical drop) | 35 -- different versions of same item (id + bonus ids + suffix + drop level, constitutes a different physical drop) |
36 if Amr.GetItemUniqueId(item1, true, true) ~= Amr.GetItemUniqueId(item2, true, true) then | 36 if Amr.GetItemUniqueId(item1, true, true) ~= Amr.GetItemUniqueId(item2, true, true) then |
37 return 10000 | 37 return 100000 |
38 end | 38 end |
39 | 39 |
40 -- different upgrade levels of the same item | 40 -- different upgrade levels of the same item |
41 if item1.upgradeId ~= item2.upgradeId then | 41 if item1.upgradeId ~= item2.upgradeId then |
42 return 1000 | 42 return 10000 |
43 end | 43 end |
44 | 44 |
45 -- a change that requires reforging is considered more different than a change that does not; | 45 -- a change that requires reforging is considered more different than a change that does not; |
46 -- it is assumed that item1 is how we want the item to be in the end, and item2 is how it currently is | 46 -- it is assumed that item1 is how we want the item to be in the end, and item2 is how it currently is |
47 local aztReforges = 0 | 47 local aztReforges = 0 |
49 | 49 |
50 if item1.id == item2.id and (item1.azerite or item2.azerite) then | 50 if item1.id == item2.id and (item1.azerite or item2.azerite) then |
51 -- azerite that needs to be reforged | 51 -- azerite that needs to be reforged |
52 if item2.azerite and not item1.azerite then | 52 if item2.azerite and not item1.azerite then |
53 -- kind of a dumb case... but we would need to blank all azerite on item2 to match item1 | 53 -- kind of a dumb case... but we would need to blank all azerite on item2 to match item1 |
54 aztReforges = #item2.azerite * 100 | 54 aztReforges = #item2.azerite * 1000 |
55 elseif item2.azerite then | 55 elseif item2.azerite then |
56 -- count up azerite on item2 but not on item1, these would need to be reforged | 56 -- count up azerite on item2 but not on item1, these would need to be reforged |
57 for i = 1, #item2.azerite do | 57 for i = 1, #item2.azerite do |
58 local missing = true | 58 local missing = true |
59 for j = 1, #item1.azerite do | 59 for j = 1, #item1.azerite do |
60 if item1.azerite[j] == item2.azerite[i] then | 60 if item1.azerite[j] == item2.azerite[i] then |
61 missing = false | 61 missing = false |
62 end | 62 end |
63 end | 63 end |
64 if missing then | 64 if missing then |
65 aztReforges = aztReforges + 100 | 65 aztReforges = aztReforges + 1000 |
66 end | 66 end |
67 end | 67 end |
68 end | 68 end |
69 | 69 |
70 -- azerite that needs to be selected | 70 -- azerite that needs to be selected |
71 if item1.azerite and not item2.azerite then | 71 if item1.azerite and not item2.azerite then |
72 -- item2 is blank, so just need to choose all the right ones | 72 -- item2 is blank, so just need to choose all the right ones |
73 aztSelects = #item1.azerite * 10 | 73 aztSelects = #item1.azerite * 100 |
74 elseif item1.azerite then | 74 elseif item1.azerite then |
75 -- count up azerite on item1 but not on item2, these would need to be selected | 75 -- count up azerite on item1 but not on item2, these would need to be selected |
76 for i = 1, #item1.azerite do | 76 for i = 1, #item1.azerite do |
77 local missing = true | 77 local missing = true |
78 for j = 1, #item2.azerite do | 78 for j = 1, #item2.azerite do |
79 if item2.azerite[j] == item1.azerite[i] then | 79 if item2.azerite[j] == item1.azerite[i] then |
80 missing = false | 80 missing = false |
81 end | 81 end |
82 end | 82 end |
83 if missing then | 83 if missing then |
84 aztSelects = aztSelects + 10 | 84 aztSelects = aztSelects + 100 |
85 end | 85 end |
86 end | 86 end |
87 end | 87 end |
88 end | 88 end |
89 | 89 |
90 -- different gems | 90 -- different gems |
91 local gemDiffs = 0 | 91 local gemDiffs = 0 |
92 for i = 1, 3 do | 92 for i = 1, 3 do |
93 if item1.gemIds[i] ~= item2.gemIds[i] then | 93 if item1.gemIds[i] ~= item2.gemIds[i] then |
94 gemDiffs = gemDiffs + 1 | 94 gemDiffs = gemDiffs + 10 |
95 end | 95 end |
96 end | 96 end |
97 | 97 |
98 -- different enchants | 98 -- different enchants |
99 local enchantDiff = 0 | 99 local enchantDiff = 0 |
100 if item1.enchantId ~= item2.enchantId then | 100 if item1.enchantId ~= item2.enchantId then |
101 enchantDiff = 1 | 101 enchantDiff = 10 |
102 end | 102 end |
103 | 103 |
104 return aztReforges + aztSelects + gemDiffs + enchantDiff | 104 -- different guid |
105 local guidDiff = 0 | |
106 if item1.guid and item2.guid and item1.guid ~= item2.guid then | |
107 guidDiff = 1 | |
108 end | |
109 | |
110 return aztReforges + aztSelects + gemDiffs + enchantDiff + guidDiff | |
105 end | 111 end |
106 | 112 |
107 -- given a table of items (keyed or indexed doesn't matter) find closest match to item, or nil if none are a match | 113 -- given a table of items (keyed or indexed doesn't matter) find closest match to item, or nil if none are a match |
108 local function findMatchingItemFromTable(item, list, bestItem, bestDiff, bestLoc, usedItems, tableType) | 114 local function findMatchingItemFromTable(item, list, bestItem, bestDiff, bestLoc, usedItems, tableType) |
109 if not list then return nil end | 115 if not list then return nil end |
132 -- search the player's equipped gear, bag, and bank for an item that best matches the specified item | 138 -- search the player's equipped gear, bag, and bank for an item that best matches the specified item |
133 function Amr:FindMatchingItem(item, player, usedItems) | 139 function Amr:FindMatchingItem(item, player, usedItems) |
134 if not item then return nil end | 140 if not item then return nil end |
135 | 141 |
136 local equipped = player.Equipped and player.Equipped[player.ActiveSpec] or nil | 142 local equipped = player.Equipped and player.Equipped[player.ActiveSpec] or nil |
137 local bestItem, bestDiff, bestLoc = findMatchingItemFromTable(item, equipped, nil, 100000, nil, usedItems, "equip") | 143 local bestItem, bestDiff, bestLoc = findMatchingItemFromTable(item, equipped, nil, 1000000, nil, usedItems, "equip") |
138 bestItem, bestDiff, bestLoc = findMatchingItemFromTable(item, player.BagItems, bestItem, bestDiff, bestLoc, usedItems, "bag") | 144 bestItem, bestDiff, bestLoc = findMatchingItemFromTable(item, player.BagItems, bestItem, bestDiff, bestLoc, usedItems, "bag") |
139 if player.BankItems then | 145 if player.BankItems then |
140 bestItem, bestDiff, bestLoc = findMatchingItemFromTable(item, player.BankItems, bestItem, bestDiff, bestLoc, usedItems, "bank") | 146 bestItem, bestDiff, bestLoc = findMatchingItemFromTable(item, player.BankItems, bestItem, bestDiff, bestLoc, usedItems, "bank") |
141 end | 147 end |
142 | 148 |
143 if bestDiff >= 100000 then | 149 if bestDiff >= 1000000 then |
144 return nil, 100000 | 150 return nil, 1000000 |
145 else | 151 else |
146 usedItems[bestLoc] = true | 152 usedItems[bestLoc] = true |
147 return bestItem, bestDiff | 153 return bestItem, bestDiff |
148 end | 154 end |
149 end | 155 end |
300 | 306 |
301 -- see if item is currently equipped, is false if don't have any item for that slot (e.g. OH for a 2-hander) | 307 -- see if item is currently equipped, is false if don't have any item for that slot (e.g. OH for a 2-hander) |
302 local isEquipped = false | 308 local isEquipped = false |
303 if equippedItem and optimalItem and Amr.GetItemUniqueId(equippedItem, false, true) == Amr.GetItemUniqueId(optimalItem, false, true) then | 309 if equippedItem and optimalItem and Amr.GetItemUniqueId(equippedItem, false, true) == Amr.GetItemUniqueId(optimalItem, false, true) then |
304 | 310 |
305 if slotId == 1 or slotId == 3 or slotId == 5 then | 311 if optimalItem.guid then |
306 -- show the item as not equipped if azerite doesn't match... might mean they have to switch to another version of same item | 312 isEquipped = optimalItem.guid == equippedItem.guid |
307 local aztDiff = countItemDifferences(optimalItem, equippedItem) | 313 else |
308 if aztDiff < 10 then | 314 --[[if slotId == 1 or slotId == 3 or slotId == 5 then |
315 -- show the item as not equipped if azerite doesn't match... might mean they have to switch to another version of same item | |
316 local aztDiff = countItemDifferences(optimalItem, equippedItem) | |
317 if aztDiff < 100 then | |
318 isEquipped = true | |
319 end | |
320 else]] | |
309 isEquipped = true | 321 isEquipped = true |
310 end | 322 --end |
311 else | |
312 isEquipped = true | |
313 end | 323 end |
314 end | 324 end |
315 | 325 |
316 --local isAzerite = optimalItem and C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItemByID(optimalItem.id) | 326 --local isAzerite = optimalItem and C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItemByID(optimalItem.id) |
317 --local isEssence = essences and optimalItem and optimalItem.id == 158075 | 327 --local isEssence = essences and optimalItem and optimalItem.id == 158075 |