LootTracker: track ground items in addition to inventory

This commit is contained in:
leejt
2020-06-14 18:04:37 -07:00
parent bd116e99e6
commit fba6d7fcf6
2 changed files with 35 additions and 3 deletions

View File

@@ -29,6 +29,7 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ListMultimap; import com.google.common.collect.ListMultimap;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -403,4 +404,25 @@ public class LootManager
return new WorldPoint(x, y, worldLocation.getPlane()); 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<ItemStack> 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<ItemStack> itemStacks = itemSpawns.get(packed);
return Collections.unmodifiableList(itemStacks);
}
} }

View File

@@ -96,6 +96,7 @@ import net.runelite.client.events.SessionClose;
import net.runelite.client.events.SessionOpen; import net.runelite.client.events.SessionOpen;
import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemManager;
import net.runelite.client.game.ItemStack; import net.runelite.client.game.ItemStack;
import net.runelite.client.game.LootManager;
import net.runelite.client.game.SpriteManager; import net.runelite.client.game.SpriteManager;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
@@ -199,6 +200,9 @@ public class LootTrackerPlugin extends Plugin
@Inject @Inject
private ChatMessageManager chatMessageManager; private ChatMessageManager chatMessageManager;
@Inject
private LootManager lootManager;
private LootTrackerPanel panel; private LootTrackerPanel panel;
private NavigationButton navButton; private NavigationButton navButton;
@VisibleForTesting @VisibleForTesting
@@ -635,7 +639,10 @@ public class LootTrackerPlugin extends Plugin
|| SEEDPACK_EVENT.equals(eventType) || SEEDPACK_EVENT.equals(eventType)
|| lootRecordType == LootRecordType.PICKPOCKET) || lootRecordType == LootRecordType.PICKPOCKET)
{ {
processInventoryLoot(eventType, lootRecordType, event.getItemContainer()); WorldPoint playerLocation = client.getLocalPlayer().getWorldLocation();
Collection<ItemStack> groundItems = lootManager.getItemSpawns(playerLocation);
processInventoryLoot(eventType, lootRecordType, event.getItemContainer(), groundItems);
eventType = null; eventType = null;
lootRecordType = null; lootRecordType = null;
} }
@@ -702,11 +709,11 @@ public class LootTrackerPlugin extends Plugin
{ {
inventorySnapshot = HashMultiset.create(); inventorySnapshot = HashMultiset.create();
Arrays.stream(itemContainer.getItems()) 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<ItemStack> groundItems)
{ {
if (inventorySnapshot != null) if (inventorySnapshot != null)
{ {
@@ -714,6 +721,9 @@ public class LootTrackerPlugin extends Plugin
Arrays.stream(inventoryContainer.getItems()) Arrays.stream(inventoryContainer.getItems())
.forEach(item -> currentInventory.add(item.getId(), item.getQuantity())); .forEach(item -> currentInventory.add(item.getId(), item.getQuantity()));
groundItems.stream()
.forEach(item -> currentInventory.add(item.getId(), item.getQuantity()));
final Multiset<Integer> diff = Multisets.difference(currentInventory, inventorySnapshot); final Multiset<Integer> diff = Multisets.difference(currentInventory, inventorySnapshot);
List<ItemStack> items = diff.entrySet().stream() List<ItemStack> items = diff.entrySet().stream()