From fba6d7fcf63cd0e29fe5e84f6937918321158285 Mon Sep 17 00:00:00 2001 From: leejt Date: Sun, 14 Jun 2020 18:04:37 -0700 Subject: [PATCH] LootTracker: track ground items in addition to inventory --- .../net/runelite/client/game/LootManager.java | 22 +++++++++++++++++++ .../loottracker/LootTrackerPlugin.java | 16 +++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/game/LootManager.java b/runelite-client/src/main/java/net/runelite/client/game/LootManager.java index ddd8157502..e44c5d7572 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/LootManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/LootManager.java @@ -29,6 +29,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ListMultimap; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -403,4 +404,25 @@ public class LootManager return new WorldPoint(x, y, worldLocation.getPlane()); } + + /** + * Get the list of items present at the provided WorldPoint that spawned this tick. + * + * @param worldPoint the location in question + * @return the list of item stacks + */ + public Collection getItemSpawns(WorldPoint worldPoint) + { + LocalPoint localPoint = LocalPoint.fromWorld(client, worldPoint); + if (localPoint == null) + { + return Collections.emptyList(); + } + + final int sceneX = localPoint.getSceneX(); + final int sceneY = localPoint.getSceneY(); + final int packed = sceneX << 8 | sceneY; + final List itemStacks = itemSpawns.get(packed); + return Collections.unmodifiableList(itemStacks); + } } 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 9fd849ac61..811a165e78 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 @@ -96,6 +96,7 @@ import net.runelite.client.events.SessionClose; import net.runelite.client.events.SessionOpen; import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemStack; +import net.runelite.client.game.LootManager; import net.runelite.client.game.SpriteManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -199,6 +200,9 @@ public class LootTrackerPlugin extends Plugin @Inject private ChatMessageManager chatMessageManager; + @Inject + private LootManager lootManager; + private LootTrackerPanel panel; private NavigationButton navButton; @VisibleForTesting @@ -635,7 +639,10 @@ public class LootTrackerPlugin extends Plugin || SEEDPACK_EVENT.equals(eventType) || lootRecordType == LootRecordType.PICKPOCKET) { - processInventoryLoot(eventType, lootRecordType, event.getItemContainer()); + WorldPoint playerLocation = client.getLocalPlayer().getWorldLocation(); + Collection groundItems = lootManager.getItemSpawns(playerLocation); + + processInventoryLoot(eventType, lootRecordType, event.getItemContainer(), groundItems); eventType = null; lootRecordType = null; } @@ -702,11 +709,11 @@ public class LootTrackerPlugin extends Plugin { inventorySnapshot = HashMultiset.create(); Arrays.stream(itemContainer.getItems()) - .forEach(item -> inventorySnapshot.add(item.getId(), item.getQuantity())); + .forEach(item -> inventorySnapshot.add(item.getId(), item.getQuantity())); } } - private void processInventoryLoot(String event, LootRecordType lootRecordType, ItemContainer inventoryContainer) + private void processInventoryLoot(String event, LootRecordType lootRecordType, ItemContainer inventoryContainer, Collection groundItems) { if (inventorySnapshot != null) { @@ -714,6 +721,9 @@ public class LootTrackerPlugin extends Plugin Arrays.stream(inventoryContainer.getItems()) .forEach(item -> currentInventory.add(item.getId(), item.getQuantity())); + groundItems.stream() + .forEach(item -> currentInventory.add(item.getId(), item.getQuantity())); + final Multiset diff = Multisets.difference(currentInventory, inventorySnapshot); List items = diff.entrySet().stream()