diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java index 015bd8ef83..2d1398b486 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java @@ -201,18 +201,22 @@ class LootTrackerBox extends JPanel outer: for (LootTrackerItem item : record.getItems()) { + final int mappedItemId = LootTrackerMapping.map(item.getId(), item.getName()); // Combine it into an existing item if one already exists for (int idx = 0; idx < items.size(); ++idx) { LootTrackerItem i = items.get(idx); - if (item.getId() == i.getId()) + if (mappedItemId == i.getId()) { items.set(idx, new LootTrackerItem(i.getId(), i.getName(), i.getQuantity() + item.getQuantity(), i.getGePrice(), i.getHaPrice(), i.isIgnored())); continue outer; } } - items.add(item); + final LootTrackerItem mappedItem = mappedItemId == item.getId() + ? item // reuse existing item + : new LootTrackerItem(mappedItemId, item.getName(), item.getQuantity(), item.getGePrice(), item.getHaPrice(), item.isIgnored()); + items.add(mappedItem); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java index eb969bbac9..691100e3ff 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java @@ -25,11 +25,13 @@ package net.runelite.client.plugins.loottracker; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @AllArgsConstructor @Getter +@EqualsAndHashCode class LootTrackerItem { private final int id; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerMapping.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerMapping.java index 3c948aa24a..42744dd121 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerMapping.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerMapping.java @@ -24,13 +24,9 @@ */ package net.runelite.client.plugins.loottracker; -import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; import lombok.AllArgsConstructor; -import net.runelite.api.ItemComposition; import net.runelite.api.ItemID; -import net.runelite.client.game.ItemManager; -import net.runelite.client.game.ItemStack; @AllArgsConstructor enum LootTrackerMapping @@ -57,25 +53,8 @@ enum LootTrackerMapping MAPPINGS = map.build(); } - private static int map(int itemId, ItemManager itemManager) + static int map(int itemId, String name) { - ItemComposition itemComp = itemManager.getItemComposition(itemId); - if (Strings.isNullOrEmpty(itemComp.getName())) - { - return itemId; - } - - return MAPPINGS.getOrDefault(itemComp.getName(), itemId); - } - - static ItemStack map(ItemStack item, ItemManager itemManager) - { - int baseId = map(item.getId(), itemManager); - if (baseId == item.getId()) - { - return item; - } - - return new ItemStack(baseId, item.getQuantity(), item.getLocation()); + return MAPPINGS.getOrDefault(name, itemId); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index 4ad04d2cd4..94fb5fd1a4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -215,14 +215,12 @@ public class LootTrackerPlugin extends Plugin private LootTrackerClient lootTrackerClient; private final List queuedLoots = new ArrayList<>(); - @VisibleForTesting - Collection stack(Collection items) + private static Collection stack(Collection items) { final List list = new ArrayList<>(); - for (ItemStack item : items) + for (final ItemStack item : items) { - item = LootTrackerMapping.map(item, itemManager); int quantity = 0; for (final ItemStack i : list) { diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerBoxTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerBoxTest.java new file mode 100644 index 0000000000..ccdc795656 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerBoxTest.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.loottracker; + +import java.util.Arrays; +import net.runelite.api.ItemID; +import net.runelite.client.game.ItemManager; +import net.runelite.http.api.loottracker.LootRecordType; +import static org.junit.Assert.assertEquals; +import org.junit.Test; +import static org.mockito.Mockito.mock; + +public class LootTrackerBoxTest +{ + @Test + public void testAddKill() + { + LootTrackerBox lootTrackerBox = new LootTrackerBox( + mock(ItemManager.class), + "Theatre of Blood", + LootRecordType.EVENT, + null, + false, + LootTrackerPriceType.GRAND_EXCHANGE, + false, + null, null, + false); + + LootTrackerItem[] items = new LootTrackerItem[]{ + new LootTrackerItem(ItemID.CLUE_SCROLL_MEDIUM, "Clue scroll (medium)", 1, 0, 0, false), + new LootTrackerItem(ItemID.CLUE_SCROLL_MEDIUM_3602, "Clue scroll (medium)", 1, 0, 0, false), + new LootTrackerItem(ItemID.GRACEFUL_HOOD_13579, "Graceful hood", 1, 0, 0, false), + }; + LootTrackerRecord lootTrackerRecord = new LootTrackerRecord( + "Theatre of Blood", + null, + LootRecordType.EVENT, + items, + 42 + ); + + lootTrackerBox.addKill(lootTrackerRecord); + + assertEquals(Arrays.asList( + new LootTrackerItem(ItemID.CLUE_SCROLL_MEDIUM, "Clue scroll (medium)", 2, 0, 0, false), + new LootTrackerItem(ItemID.GRACEFUL_HOOD_13579, "Graceful hood", 1, 0, 0, false) + ), lootTrackerBox.getItems()); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java index 456c7950f3..c6f54cb2b6 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java @@ -158,25 +158,6 @@ public class LootTrackerPluginTest return itemComposition; } - @Test - public void testClueStacks() - { - when(itemManager.getItemComposition(ItemID.CLUE_SCROLL_MEDIUM)).thenAnswer(invocation -> mockItem("Clue scroll (medium)")); - when(itemManager.getItemComposition(ItemID.CLUE_SCROLL_MEDIUM_3602)).thenAnswer(invocation -> mockItem("Clue scroll (medium)")); - when(itemManager.getItemComposition(ItemID.GRACEFUL_HOOD_13579)).thenAnswer(invocation -> mockItem("Graceful hood")); - Collection stack = lootTrackerPlugin.stack( - Arrays.asList( - new ItemStack(ItemID.CLUE_SCROLL_MEDIUM, 1, null), - new ItemStack(ItemID.CLUE_SCROLL_MEDIUM_3602, 1, null), - new ItemStack(ItemID.GRACEFUL_HOOD_13579, 1, null) - ) - ); - assertEquals(Arrays.asList( - new ItemStack(ItemID.CLUE_SCROLL_MEDIUM, 2, null), - new ItemStack(ItemID.GRACEFUL_HOOD_13579, 1, null) - ), stack); - } - @Test public void testHerbiboarHerbSack() {