(stoned)loottracker: Added missing bosses, skilling bosses and chests (#1248)

This commit is contained in:
Owain van Brakel
2019-08-04 21:08:11 +02:00
committed by Ganom
parent 59826b36d2
commit 3307b8e767
6 changed files with 320 additions and 26 deletions

View File

@@ -31,8 +31,6 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multiset;
import com.google.common.collect.Multisets;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.google.inject.Provides;
import java.awt.image.BufferedImage;
@@ -80,9 +78,11 @@ import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.ItemContainerChanged;
import net.runelite.api.events.LocalPlayerDeath;
import net.runelite.api.events.MenuOptionClicked;
import net.runelite.api.events.PlayerSpawned;
import net.runelite.api.events.WidgetLoaded;
import net.runelite.api.widgets.WidgetID;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.RuneLite;
import net.runelite.client.account.AccountSession;
import net.runelite.client.account.SessionManager;
@@ -138,6 +138,10 @@ public class LootTrackerPlugin extends Plugin
private static final String HERBIBOAR_LOOTED_MESSAGE = "You harvest herbs from the herbiboar, whereupon it escapes.";
private static final String HERBIBOAR_EVENT = "Herbiboar";
// Wintertodt loot handling
private static final Pattern WINTERTODT_NUMBER_PATTERN = Pattern.compile("Your subdued Wintertodt count is: ([0-9]*).");
private static final String WINTERTODT_EVENT = "Wintertodt";
// Hespori loot handling
private static final String HESPORI_LOOTED_MESSAGE = "You have successfully cleared this patch for new crops.";
private static final String HESPORI_EVENT = "Hespori";
@@ -166,6 +170,10 @@ public class LootTrackerPlugin extends Plugin
11062 // Camelot
);
private static final Set<String> PET_MESSAGES = ImmutableSet.of("You have a funny feeling like you're being followed",
"You feel something weird sneaking into your backpack",
"You have a funny feeling like you would have been followed");
// Instant for showing session loot. this gets set on plugin startup
public static final Instant SESSION_START_TIME = Instant.now();
@@ -175,7 +183,7 @@ public class LootTrackerPlugin extends Plugin
@VisibleForTesting
private Collection<LootRecord> lootRecords = new ArrayList<>();
private boolean pvpDeath = false;
// Last man standing map regions
private static final Set<Integer> LAST_MAN_STANDING_REGIONS = ImmutableSet.of(13658, 13659, 13914, 13915, 13916);
@@ -211,6 +219,7 @@ public class LootTrackerPlugin extends Plugin
private LootTrackerClient lootTrackerClient;
private Map<String, Integer> killCountMap = new HashMap<>();
private boolean gotPet = false;
private static Collection<ItemStack> stack(Collection<ItemStack> items)
{
@@ -431,6 +440,7 @@ public class LootTrackerPlugin extends Plugin
eventBus.subscribe(WidgetLoaded.class, this, this::onWidgetLoaded);
eventBus.subscribe(ChatMessage.class, this, this::onChatMessage);
eventBus.subscribe(ItemContainerChanged.class, this, this::onItemContainerChanged);
eventBus.subscribe(MenuOptionClicked.class, this, this::onMenuOptionClicked);
}
private void onGameStateChanged(final GameStateChanged event)
@@ -500,6 +510,19 @@ public class LootTrackerPlugin extends Plugin
}
}
if (gotPet)
{
ItemStack pet = handlePet(name);
if (pet == null)
{
log.warn("Error finding pet for npc name: {}", name);
}
else
{
items.add(pet);
}
}
SwingUtilities.invokeLater(() -> panel.add(name, localUsername, combat, entries));
LootRecord lootRecord = new LootRecord(name, localUsername, LootRecordType.NPC,
toGameItems(items), Instant.now());
@@ -535,7 +558,7 @@ public class LootTrackerPlugin extends Plugin
if (this.sendLootValueMessages)
{
if (WorldType.isDeadmanWorld(client.getWorldType()) || WorldType.isHighRiskWorld(client.getWorldType()) ||
WorldType.isPvpWorld(client.getWorldType()) || client.getVar(Varbits.IN_WILDERNESS) == 1)
WorldType.isPvpWorld(client.getWorldType()) || client.getVar(Varbits.IN_WILDERNESS) == 1)
{
final String totalValue = StackFormatter.quantityToRSStackSize(playerLootReceived.getItems().stream()
.mapToInt(itemStack -> itemManager.getItemPrice(itemStack.getId()) * itemStack.getQuantity()).sum());
@@ -590,7 +613,7 @@ public class LootTrackerPlugin extends Plugin
{
return;
}
if (WorldPoint.fromLocalInstance(client, client.getLocalPlayer()
.getLocalLocation()).getRegionID() != THEATRE_OF_BLOOD_REGION)
{
@@ -685,6 +708,11 @@ public class LootTrackerPlugin extends Plugin
final String message = event.getMessage();
if (PET_MESSAGES.stream().anyMatch(message::contains))
{
gotPet = true;
}
if (message.equals(CHEST_LOOTED_MESSAGE) || LARRAN_LOOTED_PATTERN.matcher(message).matches())
{
final int regionID = client.getLocalPlayer().getWorldLocation().getRegionID();
@@ -709,7 +737,7 @@ public class LootTrackerPlugin extends Plugin
// Remove all tags
final String chatMessage = Text.removeTags(message);
final int regionID = client.getLocalPlayer().getWorldLocation().getRegionID();
if (HESPORI_REGION == regionID && message.equals(HESPORI_LOOTED_MESSAGE))
{
@@ -788,6 +816,13 @@ public class LootTrackerPlugin extends Plugin
return;
}
}
// Handle wintertodt
Matcher wintertodt = WINTERTODT_NUMBER_PATTERN.matcher(chatMessage);
if (wintertodt.find())
{
int killCount = Integer.parseInt(wintertodt.group(1));
killCountMap.put(WINTERTODT_EVENT, killCount);
}
// Handle all other boss
Matcher boss = BOSS_NAME_NUMBER_PATTERN.matcher(chatMessage);
if (boss.find())
@@ -849,7 +884,8 @@ public class LootTrackerPlugin extends Plugin
if (CHEST_EVENT_TYPES.containsValue(eventType)
|| HERBIBOAR_EVENT.equals(eventType)
|| HESPORI_EVENT.equals(eventType)
|| GAUNTLET_EVENT.equals(eventType))
|| GAUNTLET_EVENT.equals(eventType)
|| WINTERTODT_EVENT.equals(eventType))
{
if (event.getItemContainer() != client.getItemContainer(InventoryID.INVENTORY))
{
@@ -861,6 +897,30 @@ public class LootTrackerPlugin extends Plugin
}
}
private void onMenuOptionClicked(MenuOptionClicked event)
{
if (event.getActionParam1() != WidgetInfo.INVENTORY.getId())
{
return;
}
int itemId = event.getIdentifier();
if (itemId == -1)
{
return;
}
String option = event.getOption();
ItemDefinition itemComposition = client.getItemDefinition(itemId);
if (option.equals("Open") && itemComposition.getName().equals("Supply crate"))
{
eventType = WINTERTODT_EVENT;
takeInventorySnapshot();
}
}
private void saveLocalLootRecord(LootRecord lootRecord)
{
lootRecords.add(lootRecord);
@@ -868,10 +928,7 @@ public class LootTrackerPlugin extends Plugin
{
BufferedWriter bufferedWriter = Files.newBufferedWriter(LOOT_RECORDS_FILE.toPath());
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setPrettyPrinting();
Gson gson = gsonBuilder.create();
bufferedWriter.append(gson.toJson(lootRecords));
bufferedWriter.append(RuneLiteAPI.GSON.toJson(lootRecords));
bufferedWriter.close();
}
catch (IOException e)
@@ -952,6 +1009,32 @@ public class LootTrackerPlugin extends Plugin
.map(e -> new ItemStack(e.getElement(), e.getCount(), client.getLocalPlayer().getLocalLocation()))
.collect(Collectors.toList());
if (gotPet)
{
ItemStack pet = null;
switch (chestType)
{
case HERBIBOAR_EVENT:
pet = handlePet("Herbiboar");
break;
case WINTERTODT_EVENT:
pet = handlePet("Wintertodt");
break;
case GAUNTLET_EVENT:
pet = handlePet("Gauntlet");
break;
}
if (pet == null)
{
log.warn("Error finding pet for npc name: Herbiboar");
}
else
{
items.add(pet);
}
}
final LootTrackerItem[] entries = buildEntries(stack(items));
SwingUtilities.invokeLater(() -> panel.add(chestType, client.getLocalPlayer().getName(), -1, entries));
@@ -999,7 +1082,8 @@ public class LootTrackerPlugin extends Plugin
/**
* Toggles the hidden status for a particular record
* @param name - The String name of the record to toggle the hidden status of
*
* @param name - The String name of the record to toggle the hidden status of
* @param ignore - true to ignore, false to remove
*/
void toggleNPC(String name, boolean ignore)
@@ -1020,6 +1104,7 @@ public class LootTrackerPlugin extends Plugin
/**
* Checks to see if a record name is in the list of ignored NPCs
*
* @param name - The String of the name to check
* @return - true if it is being ignored, false otherwise
*/
@@ -1105,6 +1190,30 @@ public class LootTrackerPlugin extends Plugin
return false;
}
// Pet Handling
private ItemStack handlePet(String name)
{
gotPet = false;
int petID = getPetId(name);
if (petID == -1)
{
return null;
}
return new ItemStack(petID, 1, client.getLocalPlayer().getLocalLocation());
}
private int getPetId(String name)
{
Pet pet = Pet.getByBossName(name);
if (pet != null)
{
return pet.getPetID();
}
return -1;
}
private void updateConfig()
{
this.getIgnoredItems = config.getIgnoredItems();

View File

@@ -0,0 +1,101 @@
/*
* Copyright (c) 2018, TheStonedTurtle <www.github.com/TheStonedTurtle>
* 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.HashMap;
import java.util.Map;
import lombok.Getter;
import net.runelite.api.ItemID;
@Getter
public enum Pet
{
// GWD Pets
PET_GENERAL_GRAARDOR(ItemID.PET_GENERAL_GRAARDOR, "General graador"),
PET_KREEARRA(ItemID.PET_KREEARRA, "Kree'arra"),
PET_KRIL_TSUTSAROTH(ItemID.PET_KRIL_TSUTSAROTH, "K'ril tsutsaroth"),
PET_ZILYANA(ItemID.PET_ZILYANA, "Commander zilyana"),
// Wildy Pets
CALLISTO_CUB(ItemID.CALLISTO_CUB, "Callisto"),
PET_CHAOS_ELEMENTAL(ItemID.PET_CHAOS_ELEMENTAL, "Chaos Elemental", "Chaos Fanatic"),
SCORPIAS_OFFSPRING(ItemID.SCORPIAS_OFFSPRING, "Scorpia"),
VENENATIS_SPIDERLING(ItemID.VENENATIS_SPIDERLING, "Venenatis"),
VETION_JR(ItemID.VETION_JR, "Vet'ion"),
// KBD isn't really in wildy but meh
PRINCE_BLACK_DRAGON(ItemID.PRINCE_BLACK_DRAGON, "King Black Dragon"),
// Slayer Pets
ABYSSAL_ORPHAN(ItemID.ABYSSAL_ORPHAN, "Abyssal Sire"),
HELLPUPPY(ItemID.HELLPUPPY, "Cerberus"),
NOON(ItemID.NOON, "Noon", "Dusk"),
PET_KRAKEN(ItemID.PET_KRAKEN, "Kraken"),
PET_SMOKE_DEVIL(ItemID.PET_SMOKE_DEVIL, "Thermonuclear Smoke Devil"),
SKOTOS(ItemID.SKOTOS, "Skotizo"),
// Other Bosses
BABY_MOLE(ItemID.BABY_MOLE, "Giant Mole"),
KALPHITE_PRINCESS(ItemID.KALPHITE_PRINCESS, "Kalphite Queen"),
OLMLET(ItemID.OLMLET, "Chambers of Xeric"),
LIL_ZIK(ItemID.LIL_ZIK, "Theatre of Blood"),
PET_DARK_CORE(ItemID.PET_DARK_CORE, "Corporeal Beast"),
PET_SNAKELING(ItemID.PET_SNAKELING, "Zulrah"),
PET_DAGANNOTH_REX(ItemID.PET_DAGANNOTH_REX, "Dagannoth Rex"),
PET_DAGANNOTH_PRIME(ItemID.PET_DAGANNOTH_PRIME, "Dagannoth Prime"),
PET_DAGANNOTH_SUPREME(ItemID.PET_DAGANNOTH_SUPREME, "Dagannoth Supreme"),
VORKI(ItemID.VORKI, "Vorkath"),
BLOODHOUND(ItemID.BLOODHOUND, "Clue Scroll (Master)"),
HERBI(ItemID.HERBI, "Herbiboar"),
IKKLE_HYDRA(ItemID.IKKLE_HYDRA, "Alchemical Hydra"),
PHOENIX(ItemID.PHOENIX, "Wintertodt"),
YOUNGLLEF(ItemID.YOUNGLLEF, "Gauntlet"),
SRARACHA(ItemID.SRARACHA, "Sraracha");
private final int petID;
private final String[] bossNames;
private static final Map<String, Pet> byBossName = buildBossMap();
Pet(int id, String... bossNames)
{
this.petID = id;
this.bossNames = bossNames;
}
public static Pet getByBossName(String name)
{
return byBossName.get(name.toUpperCase());
}
private static Map<String, Pet> buildBossMap()
{
Map<String, Pet> byName = new HashMap<>();
for (Pet pet : values())
{
String[] droppingBosses = pet.getBossNames();
for (String bossName : droppingBosses)
{
byName.put(bossName.toUpperCase(), pet);
}
}
return byName;
}
}

View File

@@ -80,8 +80,20 @@ public enum BossTab
// Other Bosses
GIANT_MOLE("Giant Mole", ItemID.BABY_MOLE, "Other"),
CORPOREAL_BEAST("Corporeal Beast", ItemID.PET_CORPOREAL_CRITTER, "Other"),
SARACHNIS("Sarachnis", ItemID.SRARACHA, "Other"),
THE_GAUNTLET("The Gauntlet", ItemID.YOUNGLLEF, "Other"),
// Skilling
WINTERTODT("Wintertodt", ItemID.PHOENIX, "Skilling"),
HERBIBOAR("Herbiboar", ItemID.HERBI, "Skilling"),
// Chests
BRIMSTONE_CHEST("Brimstone Chest", ItemID.BRIMSTONE_KEY, "Chests"),
CRYSTAL_CHEST("Crystal Chest", ItemID.CRYSTAL_KEY, "Chests"),
LARRANS_BIG_CHEST("Larran's big chest", ItemID.LARRANS_KEY, "Chests"),
LARRENS_SMALL_CHEST("Larran's small chest", ItemID.LARRANS_KEY, "Chests"),
ELVEN_CRYSTAL_CHEST("Elven Crystal Chest", ItemID.ENHANCED_CRYSTAL_KEY, "Chests"),
// Dagannoth Kings
DAGANNOTH_REX("Dagannoth Rex", ItemID.PET_DAGANNOTH_REX, "Dagannoth Kings"),
DAGANNOTH_PRIME("Dagannoth Prime", ItemID.PET_DAGANNOTH_PRIME, "Dagannoth Kings"),

View File

@@ -50,7 +50,7 @@ public enum UniqueItem
DRAGON_2H_SWORD(ItemID.DRAGON_2H_SWORD, BossTab.CALLISTO, BossTab.VETION, BossTab.VENENATIS, BossTab.KALPHITE_QUEEN),
// Other
DRAGON_CHAINBODY(ItemID.DRAGON_CHAINBODY_3140, BossTab.THERMONUCLEAR_SMOKE_DEVIL, BossTab.KALPHITE_QUEEN),
DRAGON_AXE(ItemID.DRAGON_AXE, BossTab.DAGANNOTH_REX, BossTab.DAGANNOTH_PRIME, BossTab.DAGANNOTH_SUPREME),
DRAGON_AXE(ItemID.DRAGON_AXE, BossTab.DAGANNOTH_REX, BossTab.DAGANNOTH_PRIME, BossTab.DAGANNOTH_SUPREME, BossTab.WINTERTODT),
UNCUT_ONYX(ItemID.UNCUT_ONYX, BossTab.ZULRAH, BossTab.SKOTIZO),
// Unique Items
@@ -118,7 +118,6 @@ public enum UniqueItem
JUSTICIAR_CHESTGUARD(ItemID.JUSTICIAR_CHESTGUARD, BossTab.THEATRE_OF_BLOOD, 1),
JUSTICIAR_LEGGUARDS(ItemID.JUSTICIAR_LEGGUARDS, BossTab.THEATRE_OF_BLOOD, 1),
// Zulrah
// Uniques
TANZANITE_FANG(ItemID.TANZANITE_FANG, BossTab.ZULRAH, -1),
@@ -177,7 +176,7 @@ public enum UniqueItem
TYRANNICAL_RING(ItemID.TYRANNICAL_RING, BossTab.CALLISTO, -1),
CALLISTO_CUB(ItemID.CALLISTO_CUB, BossTab.CALLISTO, -1),
// Chaos Elemental Uniques are all in Shared
// Chaos Fanatic
// Chaos Fanatic
ODIUM_SHARD_1(ItemID.ODIUM_SHARD_1, BossTab.CHAOS_FANATIC, -1),
MALEDICTION_SHARD_1(ItemID.MALEDICTION_SHARD_1, BossTab.CHAOS_FANATIC, -1),
// Crazy Archaeologist
@@ -194,7 +193,7 @@ public enum UniqueItem
PRINCE_BLACK_DRAGON(ItemID.PRINCE_BLACK_DRAGON, BossTab.KING_BLACK_DRAGON, -1),
// Slayer Bosses
// Skotizo
// Skotizo
DARK_CLAW(ItemID.DARK_CLAW, BossTab.SKOTIZO, -1),
SKOTOS(ItemID.SKOTOS, BossTab.SKOTIZO, -1),
JAR_OF_DARKNESS(ItemID.JAR_OF_DARKNESS, BossTab.SKOTIZO, -1),
@@ -245,7 +244,7 @@ public enum UniqueItem
// Other Bosses
// Giant Mole
// Giant Mole
BABY_MOLE(ItemID.BABY_MOLE, BossTab.GIANT_MOLE, -1),
// Kalphite Queen
KQ_HEAD(ItemID.KQ_HEAD, BossTab.KALPHITE_QUEEN, -1),
@@ -258,6 +257,10 @@ public enum UniqueItem
SPECTRAL_SIGIL(ItemID.SPECTRAL_SIGIL, BossTab.CORPOREAL_BEAST, 1),
ARCANE_SIGIL(ItemID.ARCANE_SIGIL, BossTab.CORPOREAL_BEAST, 1),
ELYSIAN_SIGIL(ItemID.ELYSIAN_SIGIL, BossTab.CORPOREAL_BEAST, 1),
// Sraracha
SARACHNIS_CUDGEL(ItemID.SARACHNIS_CUDGEL, BossTab.SARACHNIS, 0),
JAR_OF_EYES(ItemID.JAR_OF_EYES, BossTab.SARACHNIS, 0),
SRARACHA(ItemID.SRARACHA, BossTab.SARACHNIS, 0),
// The Gauntlet
CRYSTAL_SHARD(ItemID.CRYSTAL_SHARD, BossTab.THE_GAUNTLET, 0),
CRYSTAL_WEAPON_SEED(ItemID.CRYSTAL_WEAPON_SEED, BossTab.THE_GAUNTLET, 0),
@@ -837,7 +840,35 @@ public enum UniqueItem
ALE_OF_THE_GODS(ItemID.ALE_OF_THE_GODS, BossTab.CLUE_SCROLL_MASTER, 9),
BUCKET_HELM_G(ItemID.BUCKET_HELM_G, BossTab.CLUE_SCROLL_MASTER, 9),
BOWL_WIG(ItemID.BOWL_WIG, BossTab.CLUE_SCROLL_MASTER, 9),
BLOODHOUND(ItemID.BLOODHOUND, BossTab.CLUE_SCROLL_MASTER, 9);
BLOODHOUND(ItemID.BLOODHOUND, BossTab.CLUE_SCROLL_MASTER, 9),
// Wintertodt
BRUMA_TORCH(ItemID.BRUMA_TORCH, BossTab.WINTERTODT, -1),
TOME_OF_FIRE(ItemID.TOME_OF_FIRE_EMPTY, BossTab.WINTERTODT, -1),
PET_PHOENIX(ItemID.PHOENIX, BossTab.WINTERTODT, -1),
PYROMANCER_HOOD(ItemID.PYROMANCER_HOOD, BossTab.WINTERTODT, 0),
PYROMANCER_GARB(ItemID.PYROMANCER_GARB, BossTab.WINTERTODT, 0),
PYROMANCER_ROBE(ItemID.PYROMANCER_ROBE, BossTab.WINTERTODT, 0),
PYROMANCER_BOOTS(ItemID.PYROMANCER_BOOTS, BossTab.WINTERTODT, 0),
WARM_GLOVES(ItemID.WARM_GLOVES, BossTab.WINTERTODT, 0),
// Herbiboar
HERBI(ItemID.HERBI, BossTab.HERBIBOAR, 0),
// Elven Crystal Chest
DRAGONSTONE_FULL_HELM(ItemID.DRAGONSTONE_FULL_HELM, BossTab.ELVEN_CRYSTAL_CHEST, 0),
DRAGONSTONE_PLATEBODY(ItemID.DRAGONSTONE_PLATEBODY, BossTab.ELVEN_CRYSTAL_CHEST, 0),
DRAGONSTONE_PLATELEGS(ItemID.DRAGONSTONE_PLATELEGS, BossTab.ELVEN_CRYSTAL_CHEST, 0),
DRAGONSTONE_BOOTS(ItemID.DRAGONSTONE_BOOTS, BossTab.ELVEN_CRYSTAL_CHEST, 0),
DRAGONSTONE_GAUNTLETS(ItemID.DRAGONSTONE_GAUNTLETS, BossTab.ELVEN_CRYSTAL_CHEST, 0),
// Brimstone chest
MYSTIC_HAT_DUSK(ItemID.MYSTIC_HAT_DUSK, BossTab.BRIMSTONE_CHEST, 0),
MYSTIC_ROBE_TOP_DUSK(ItemID.MYSTIC_ROBE_TOP_DUSK, BossTab.BRIMSTONE_CHEST, 0),
MYSTIC_ROBE_BOTTOM_DUSK(ItemID.MYSTIC_ROBE_BOTTOM_DUSK, BossTab.BRIMSTONE_CHEST, 0),
MYSTIC_GLOVES_DUSK(ItemID.MYSTIC_GLOVES_DUSK, BossTab.BRIMSTONE_CHEST, 0),
MYSTIC_BOOTS_DUSK(ItemID.MYSTIC_BOOTS_DUSK, BossTab.BRIMSTONE_CHEST, 0),
BROKEN_DRAGON_HASTA(ItemID.BROKEN_DRAGON_HASTA, BossTab.BRIMSTONE_CHEST, 0);
private static final ImmutableMultimap<String, UniqueItem> BOSS_MAP;

View File

@@ -51,6 +51,7 @@ import net.runelite.client.ui.ColorScheme;
@Slf4j
class LootPanel extends JPanel
{
private final String name;
private final Collection<LTRecord> records;
private final Collection<UniqueItem> uniques;
private final boolean hideUniques;
@@ -64,6 +65,7 @@ class LootPanel extends JPanel
private boolean cancelPlayback = false;
LootPanel(
final String name,
final Collection<LTRecord> records,
final Collection<UniqueItem> uniques,
final boolean hideUnqiues,
@@ -71,6 +73,7 @@ class LootPanel extends JPanel
final boolean itemBreakdown,
final ItemManager itemManager)
{
this.name = name;
this.records = records;
this.uniques = uniques;
this.hideUniques = hideUnqiues;
@@ -148,7 +151,6 @@ class LootPanel extends JPanel
// Also add all Item IDs for uniques to a Set for easy hiding later on.
for (final UniqueItem item : this.uniques)
{
final int id = item.getItemID();
final int linkedId = item.getLinkedID();
uniqueIds.add(id);
@@ -171,21 +173,60 @@ class LootPanel extends JPanel
}
// Attach Kill Count Panel(s)
if (records.size() > 0)
final int amount = records.size();
String currentText;
String loggedText;
log.info(name);
switch (name)
{
case "Wintertodt":
currentText = "Current Killcount:";
loggedText = "Crates logged:";
break;
case "Herbiboar":
currentText = "Herbiboars looted:";
loggedText = "Loots logged:";
break;
case "Brimstone Chest":
case "Crystal Chest":
case "Larran's big chest":
case "Larran's small chest":
case "Elven Crystal Chest":
currentText = "Chests opened:";
loggedText = "Chests logged:";
break;
case "Clue Scroll (Beginner)":
case "Clue Scroll (Easy)":
case "Clue Scroll (Medium)":
case "Clue Scroll (Hard)":
case "Clue Scroll (Elite)":
case "Clue Scroll (Master)":
currentText = "Clues completed:";
loggedText = "Clues logged:";
break;
default:
currentText = "Current Killcount:";
loggedText = "Kills logged:";
break;
}
if (amount > 0)
{
final int amount = records.size();
final LTRecord entry = Iterators.get(records.iterator(), (amount - 1));
if (entry.getKillCount() != -1)
{
final TextPanel p = new TextPanel("Current Killcount:", entry.getKillCount());
final TextPanel p = new TextPanel(currentText, entry.getKillCount());
this.add(p, c);
c.gridy++;
}
final TextPanel p2 = new TextPanel("Kills Logged:", amount);
this.add(p2, c);
c.gridy++;
}
final TextPanel p2 = new TextPanel(loggedText, amount);
this.add(p2, c);
c.gridy++;
// Track total price of all tracked items for this panel
// Also ensure it is placed in correct location by preserving its gridy value
long totalValue = consolidated.values().stream().mapToLong(e -> e.getPrice() * e.getQuantity()).sum();

View File

@@ -131,7 +131,7 @@ public class LootTrackerPanel extends PluginPanel
uniques = uniques.stream().sorted(Comparator.comparingInt(UniqueItem::getPosition)).collect(Collectors.toList());
final JPanel title = createLootViewTitle(name);
lootPanel = new LootPanel(data, uniques, plugin.config.hideUniques(), plugin.config.itemSortType(), plugin.config.itemBreakdown(), itemManager);
lootPanel = new LootPanel(name, data, uniques, plugin.config.hideUniques(), plugin.config.itemSortType(), plugin.config.itemBreakdown(), itemManager);
this.add(title, BorderLayout.NORTH);
this.add(wrapContainer(lootPanel), BorderLayout.CENTER);