(stoned)loottracker: Added missing bosses, skilling bosses and chests (#1248)
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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"),
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user