From 3307b8e767ddc8164b5a530857a777002f5ae323 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Sun, 4 Aug 2019 21:08:11 +0200 Subject: [PATCH] (stoned)loottracker: Added missing bosses, skilling bosses and chests (#1248) --- .../loottracker/LootTrackerPlugin.java | 133 ++++++++++++++++-- .../client/plugins/loottracker/Pet.java | 101 +++++++++++++ .../plugins/stonedtracker/data/BossTab.java | 12 ++ .../stonedtracker/data/UniqueItem.java | 43 +++++- .../plugins/stonedtracker/ui/LootPanel.java | 55 +++++++- .../stonedtracker/ui/LootTrackerPanel.java | 2 +- 6 files changed, 320 insertions(+), 26 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/loottracker/Pet.java 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 e959bb7fbc..f76cc90971 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 @@ -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 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 lootRecords = new ArrayList<>(); private boolean pvpDeath = false; - + // Last man standing map regions private static final Set 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 killCountMap = new HashMap<>(); + private boolean gotPet = false; private static Collection stack(Collection 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(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/Pet.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/Pet.java new file mode 100644 index 0000000000..c5de642cbd --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/Pet.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018, 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 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 buildBossMap() + { + Map byName = new HashMap<>(); + for (Pet pet : values()) + { + String[] droppingBosses = pet.getBossNames(); + for (String bossName : droppingBosses) + { + byName.put(bossName.toUpperCase(), pet); + } + } + return byName; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/data/BossTab.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/data/BossTab.java index e25b3d925d..f3480e0835 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/data/BossTab.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/data/BossTab.java @@ -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"), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/data/UniqueItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/data/UniqueItem.java index 4e6d4c7188..5f38bc1d06 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/data/UniqueItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/data/UniqueItem.java @@ -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 BOSS_MAP; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/ui/LootPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/ui/LootPanel.java index c6fa930898..a36aeda708 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/ui/LootPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/ui/LootPanel.java @@ -51,6 +51,7 @@ import net.runelite.client.ui.ColorScheme; @Slf4j class LootPanel extends JPanel { + private final String name; private final Collection records; private final Collection uniques; private final boolean hideUniques; @@ -64,6 +65,7 @@ class LootPanel extends JPanel private boolean cancelPlayback = false; LootPanel( + final String name, final Collection records, final Collection 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(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/ui/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/ui/LootTrackerPanel.java index 523f9cc07d..7e50c48a7d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/ui/LootTrackerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/stonedtracker/ui/LootTrackerPanel.java @@ -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);