Loot Tracker

AdvancedData

Tracks items picked up from the ground. Demonstrates ground item event handling and data tracking.

18 min read

What It Does

Tracks items picked up from the ground. Demonstrates ground item event handling and data tracking.

Source Code

java
1package com.example;
2
3import net.runelite.api.Client;
4import net.runelite.api.ItemContainer;
5import net.runelite.api.Item;
6import net.runelite.api.events.ItemContainerChanged;
7import net.runelite.client.eventbus.Subscribe;
8import net.runelite.client.plugins.Plugin;
9import net.runelite.client.plugins.PluginDescriptor;
10import javax.inject.Inject;
11import java.util.HashMap;
12import java.util.Map;
13
14@PluginDescriptor(
15    name = "Loot Tracker",
16    description = "Tracks picked up items"
17)
18public class LootTrackerPlugin extends Plugin {
19    @Inject
20    private Client client;
21
22    private Map<Integer, Integer> lootedItems = new HashMap<>();
23    private ItemContainer previousInventory = null;
24
25    @Subscribe
26    public void onItemContainerChanged(ItemContainerChanged event) {
27        if (event.getContainerId() == net.runelite.api.InventoryID.INVENTORY.getId()) {
28            ItemContainer currentInventory = event.getItemContainer();
29            
30            if (previousInventory != null) {
31                // Compare before/after to detect exact pickups
32                Map<Integer, Integer> beforeCounts = countItems(previousInventory);
33                Map<Integer, Integer> afterCounts = countItems(currentInventory);
34                
35                // Find items that increased (were picked up)
36                for (Map.Entry<Integer, Integer> entry : afterCounts.entrySet()) {
37                    int itemId = entry.getKey();
38                    int afterCount = entry.getValue();
39                    int beforeCount = beforeCounts.getOrDefault(itemId, 0);
40                    
41                    if (afterCount > beforeCount) {
42                        int gained = afterCount - beforeCount;
43                        lootedItems.put(itemId, lootedItems.getOrDefault(itemId, 0) + gained);
44                        System.out.println("Looted " + gained + "x item " + itemId);
45                    }
46                }
47            }
48            
49            previousInventory = currentInventory;
50        }
51    }
52
53    private Map<Integer, Integer> countItems(ItemContainer container) {
54        Map<Integer, Integer> counts = new HashMap<>();
55        if (container != null) {
56            for (Item item : container.getItems()) {
57                if (item.getId() != -1) {
58                    counts.put(item.getId(), counts.getOrDefault(item.getId(), 0) + item.getQuantity());
59                }
60            }
61        }
62        return counts;
63    }
64}

Code Annotations

Line 20

Map to store looted item counts

Line 23

Listen for items appearing

Line 28

Listen for items being picked up

Line 30

Track item in map

API Classes Used

Key Concepts

  • Map to store looted item counts
  • Listen for items appearing
  • Listen for items being picked up
  • Track item in map

Next Steps

  • Learn about ItemSpawned/Despawned events
  • Add overlay to display loot
  • Filter by item value