(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.ImmutableSet;
|
||||||
import com.google.common.collect.Multiset;
|
import com.google.common.collect.Multiset;
|
||||||
import com.google.common.collect.Multisets;
|
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.gson.reflect.TypeToken;
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
import java.awt.image.BufferedImage;
|
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.GameStateChanged;
|
||||||
import net.runelite.api.events.ItemContainerChanged;
|
import net.runelite.api.events.ItemContainerChanged;
|
||||||
import net.runelite.api.events.LocalPlayerDeath;
|
import net.runelite.api.events.LocalPlayerDeath;
|
||||||
|
import net.runelite.api.events.MenuOptionClicked;
|
||||||
import net.runelite.api.events.PlayerSpawned;
|
import net.runelite.api.events.PlayerSpawned;
|
||||||
import net.runelite.api.events.WidgetLoaded;
|
import net.runelite.api.events.WidgetLoaded;
|
||||||
import net.runelite.api.widgets.WidgetID;
|
import net.runelite.api.widgets.WidgetID;
|
||||||
|
import net.runelite.api.widgets.WidgetInfo;
|
||||||
import net.runelite.client.RuneLite;
|
import net.runelite.client.RuneLite;
|
||||||
import net.runelite.client.account.AccountSession;
|
import net.runelite.client.account.AccountSession;
|
||||||
import net.runelite.client.account.SessionManager;
|
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_LOOTED_MESSAGE = "You harvest herbs from the herbiboar, whereupon it escapes.";
|
||||||
private static final String HERBIBOAR_EVENT = "Herbiboar";
|
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
|
// Hespori loot handling
|
||||||
private static final String HESPORI_LOOTED_MESSAGE = "You have successfully cleared this patch for new crops.";
|
private static final String HESPORI_LOOTED_MESSAGE = "You have successfully cleared this patch for new crops.";
|
||||||
private static final String HESPORI_EVENT = "Hespori";
|
private static final String HESPORI_EVENT = "Hespori";
|
||||||
@@ -166,6 +170,10 @@ public class LootTrackerPlugin extends Plugin
|
|||||||
11062 // Camelot
|
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
|
// Instant for showing session loot. this gets set on plugin startup
|
||||||
|
|
||||||
public static final Instant SESSION_START_TIME = Instant.now();
|
public static final Instant SESSION_START_TIME = Instant.now();
|
||||||
@@ -211,6 +219,7 @@ public class LootTrackerPlugin extends Plugin
|
|||||||
private LootTrackerClient lootTrackerClient;
|
private LootTrackerClient lootTrackerClient;
|
||||||
|
|
||||||
private Map<String, Integer> killCountMap = new HashMap<>();
|
private Map<String, Integer> killCountMap = new HashMap<>();
|
||||||
|
private boolean gotPet = false;
|
||||||
|
|
||||||
private static Collection<ItemStack> stack(Collection<ItemStack> items)
|
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(WidgetLoaded.class, this, this::onWidgetLoaded);
|
||||||
eventBus.subscribe(ChatMessage.class, this, this::onChatMessage);
|
eventBus.subscribe(ChatMessage.class, this, this::onChatMessage);
|
||||||
eventBus.subscribe(ItemContainerChanged.class, this, this::onItemContainerChanged);
|
eventBus.subscribe(ItemContainerChanged.class, this, this::onItemContainerChanged);
|
||||||
|
eventBus.subscribe(MenuOptionClicked.class, this, this::onMenuOptionClicked);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onGameStateChanged(final GameStateChanged event)
|
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));
|
SwingUtilities.invokeLater(() -> panel.add(name, localUsername, combat, entries));
|
||||||
LootRecord lootRecord = new LootRecord(name, localUsername, LootRecordType.NPC,
|
LootRecord lootRecord = new LootRecord(name, localUsername, LootRecordType.NPC,
|
||||||
toGameItems(items), Instant.now());
|
toGameItems(items), Instant.now());
|
||||||
@@ -535,7 +558,7 @@ public class LootTrackerPlugin extends Plugin
|
|||||||
if (this.sendLootValueMessages)
|
if (this.sendLootValueMessages)
|
||||||
{
|
{
|
||||||
if (WorldType.isDeadmanWorld(client.getWorldType()) || WorldType.isHighRiskWorld(client.getWorldType()) ||
|
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()
|
final String totalValue = StackFormatter.quantityToRSStackSize(playerLootReceived.getItems().stream()
|
||||||
.mapToInt(itemStack -> itemManager.getItemPrice(itemStack.getId()) * itemStack.getQuantity()).sum());
|
.mapToInt(itemStack -> itemManager.getItemPrice(itemStack.getId()) * itemStack.getQuantity()).sum());
|
||||||
@@ -685,6 +708,11 @@ public class LootTrackerPlugin extends Plugin
|
|||||||
|
|
||||||
final String message = event.getMessage();
|
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())
|
if (message.equals(CHEST_LOOTED_MESSAGE) || LARRAN_LOOTED_PATTERN.matcher(message).matches())
|
||||||
{
|
{
|
||||||
final int regionID = client.getLocalPlayer().getWorldLocation().getRegionID();
|
final int regionID = client.getLocalPlayer().getWorldLocation().getRegionID();
|
||||||
@@ -788,6 +816,13 @@ public class LootTrackerPlugin extends Plugin
|
|||||||
return;
|
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
|
// Handle all other boss
|
||||||
Matcher boss = BOSS_NAME_NUMBER_PATTERN.matcher(chatMessage);
|
Matcher boss = BOSS_NAME_NUMBER_PATTERN.matcher(chatMessage);
|
||||||
if (boss.find())
|
if (boss.find())
|
||||||
@@ -849,7 +884,8 @@ public class LootTrackerPlugin extends Plugin
|
|||||||
if (CHEST_EVENT_TYPES.containsValue(eventType)
|
if (CHEST_EVENT_TYPES.containsValue(eventType)
|
||||||
|| HERBIBOAR_EVENT.equals(eventType)
|
|| HERBIBOAR_EVENT.equals(eventType)
|
||||||
|| HESPORI_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))
|
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)
|
private void saveLocalLootRecord(LootRecord lootRecord)
|
||||||
{
|
{
|
||||||
lootRecords.add(lootRecord);
|
lootRecords.add(lootRecord);
|
||||||
@@ -868,10 +928,7 @@ public class LootTrackerPlugin extends Plugin
|
|||||||
{
|
{
|
||||||
BufferedWriter bufferedWriter = Files.newBufferedWriter(LOOT_RECORDS_FILE.toPath());
|
BufferedWriter bufferedWriter = Files.newBufferedWriter(LOOT_RECORDS_FILE.toPath());
|
||||||
|
|
||||||
GsonBuilder gsonBuilder = new GsonBuilder();
|
bufferedWriter.append(RuneLiteAPI.GSON.toJson(lootRecords));
|
||||||
gsonBuilder.setPrettyPrinting();
|
|
||||||
Gson gson = gsonBuilder.create();
|
|
||||||
bufferedWriter.append(gson.toJson(lootRecords));
|
|
||||||
bufferedWriter.close();
|
bufferedWriter.close();
|
||||||
}
|
}
|
||||||
catch (IOException e)
|
catch (IOException e)
|
||||||
@@ -952,6 +1009,32 @@ public class LootTrackerPlugin extends Plugin
|
|||||||
.map(e -> new ItemStack(e.getElement(), e.getCount(), client.getLocalPlayer().getLocalLocation()))
|
.map(e -> new ItemStack(e.getElement(), e.getCount(), client.getLocalPlayer().getLocalLocation()))
|
||||||
.collect(Collectors.toList());
|
.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));
|
final LootTrackerItem[] entries = buildEntries(stack(items));
|
||||||
SwingUtilities.invokeLater(() -> panel.add(chestType, client.getLocalPlayer().getName(), -1, entries));
|
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
|
* 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
|
* @param ignore - true to ignore, false to remove
|
||||||
*/
|
*/
|
||||||
void toggleNPC(String name, boolean ignore)
|
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
|
* Checks to see if a record name is in the list of ignored NPCs
|
||||||
|
*
|
||||||
* @param name - The String of the name to check
|
* @param name - The String of the name to check
|
||||||
* @return - true if it is being ignored, false otherwise
|
* @return - true if it is being ignored, false otherwise
|
||||||
*/
|
*/
|
||||||
@@ -1105,6 +1190,30 @@ public class LootTrackerPlugin extends Plugin
|
|||||||
return false;
|
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()
|
private void updateConfig()
|
||||||
{
|
{
|
||||||
this.getIgnoredItems = config.getIgnoredItems();
|
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
|
// Other Bosses
|
||||||
GIANT_MOLE("Giant Mole", ItemID.BABY_MOLE, "Other"),
|
GIANT_MOLE("Giant Mole", ItemID.BABY_MOLE, "Other"),
|
||||||
CORPOREAL_BEAST("Corporeal Beast", ItemID.PET_CORPOREAL_CRITTER, "Other"),
|
CORPOREAL_BEAST("Corporeal Beast", ItemID.PET_CORPOREAL_CRITTER, "Other"),
|
||||||
|
SARACHNIS("Sarachnis", ItemID.SRARACHA, "Other"),
|
||||||
THE_GAUNTLET("The Gauntlet", ItemID.YOUNGLLEF, "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 Kings
|
||||||
DAGANNOTH_REX("Dagannoth Rex", ItemID.PET_DAGANNOTH_REX, "Dagannoth Kings"),
|
DAGANNOTH_REX("Dagannoth Rex", ItemID.PET_DAGANNOTH_REX, "Dagannoth Kings"),
|
||||||
DAGANNOTH_PRIME("Dagannoth Prime", ItemID.PET_DAGANNOTH_PRIME, "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),
|
DRAGON_2H_SWORD(ItemID.DRAGON_2H_SWORD, BossTab.CALLISTO, BossTab.VETION, BossTab.VENENATIS, BossTab.KALPHITE_QUEEN),
|
||||||
// Other
|
// Other
|
||||||
DRAGON_CHAINBODY(ItemID.DRAGON_CHAINBODY_3140, BossTab.THERMONUCLEAR_SMOKE_DEVIL, BossTab.KALPHITE_QUEEN),
|
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),
|
UNCUT_ONYX(ItemID.UNCUT_ONYX, BossTab.ZULRAH, BossTab.SKOTIZO),
|
||||||
|
|
||||||
// Unique Items
|
// Unique Items
|
||||||
@@ -118,7 +118,6 @@ public enum UniqueItem
|
|||||||
JUSTICIAR_CHESTGUARD(ItemID.JUSTICIAR_CHESTGUARD, BossTab.THEATRE_OF_BLOOD, 1),
|
JUSTICIAR_CHESTGUARD(ItemID.JUSTICIAR_CHESTGUARD, BossTab.THEATRE_OF_BLOOD, 1),
|
||||||
JUSTICIAR_LEGGUARDS(ItemID.JUSTICIAR_LEGGUARDS, BossTab.THEATRE_OF_BLOOD, 1),
|
JUSTICIAR_LEGGUARDS(ItemID.JUSTICIAR_LEGGUARDS, BossTab.THEATRE_OF_BLOOD, 1),
|
||||||
|
|
||||||
|
|
||||||
// Zulrah
|
// Zulrah
|
||||||
// Uniques
|
// Uniques
|
||||||
TANZANITE_FANG(ItemID.TANZANITE_FANG, BossTab.ZULRAH, -1),
|
TANZANITE_FANG(ItemID.TANZANITE_FANG, BossTab.ZULRAH, -1),
|
||||||
@@ -177,7 +176,7 @@ public enum UniqueItem
|
|||||||
TYRANNICAL_RING(ItemID.TYRANNICAL_RING, BossTab.CALLISTO, -1),
|
TYRANNICAL_RING(ItemID.TYRANNICAL_RING, BossTab.CALLISTO, -1),
|
||||||
CALLISTO_CUB(ItemID.CALLISTO_CUB, BossTab.CALLISTO, -1),
|
CALLISTO_CUB(ItemID.CALLISTO_CUB, BossTab.CALLISTO, -1),
|
||||||
// Chaos Elemental Uniques are all in Shared
|
// Chaos Elemental Uniques are all in Shared
|
||||||
// Chaos Fanatic
|
// Chaos Fanatic
|
||||||
ODIUM_SHARD_1(ItemID.ODIUM_SHARD_1, BossTab.CHAOS_FANATIC, -1),
|
ODIUM_SHARD_1(ItemID.ODIUM_SHARD_1, BossTab.CHAOS_FANATIC, -1),
|
||||||
MALEDICTION_SHARD_1(ItemID.MALEDICTION_SHARD_1, BossTab.CHAOS_FANATIC, -1),
|
MALEDICTION_SHARD_1(ItemID.MALEDICTION_SHARD_1, BossTab.CHAOS_FANATIC, -1),
|
||||||
// Crazy Archaeologist
|
// Crazy Archaeologist
|
||||||
@@ -194,7 +193,7 @@ public enum UniqueItem
|
|||||||
PRINCE_BLACK_DRAGON(ItemID.PRINCE_BLACK_DRAGON, BossTab.KING_BLACK_DRAGON, -1),
|
PRINCE_BLACK_DRAGON(ItemID.PRINCE_BLACK_DRAGON, BossTab.KING_BLACK_DRAGON, -1),
|
||||||
|
|
||||||
// Slayer Bosses
|
// Slayer Bosses
|
||||||
// Skotizo
|
// Skotizo
|
||||||
DARK_CLAW(ItemID.DARK_CLAW, BossTab.SKOTIZO, -1),
|
DARK_CLAW(ItemID.DARK_CLAW, BossTab.SKOTIZO, -1),
|
||||||
SKOTOS(ItemID.SKOTOS, BossTab.SKOTIZO, -1),
|
SKOTOS(ItemID.SKOTOS, BossTab.SKOTIZO, -1),
|
||||||
JAR_OF_DARKNESS(ItemID.JAR_OF_DARKNESS, BossTab.SKOTIZO, -1),
|
JAR_OF_DARKNESS(ItemID.JAR_OF_DARKNESS, BossTab.SKOTIZO, -1),
|
||||||
@@ -245,7 +244,7 @@ public enum UniqueItem
|
|||||||
|
|
||||||
|
|
||||||
// Other Bosses
|
// Other Bosses
|
||||||
// Giant Mole
|
// Giant Mole
|
||||||
BABY_MOLE(ItemID.BABY_MOLE, BossTab.GIANT_MOLE, -1),
|
BABY_MOLE(ItemID.BABY_MOLE, BossTab.GIANT_MOLE, -1),
|
||||||
// Kalphite Queen
|
// Kalphite Queen
|
||||||
KQ_HEAD(ItemID.KQ_HEAD, BossTab.KALPHITE_QUEEN, -1),
|
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),
|
SPECTRAL_SIGIL(ItemID.SPECTRAL_SIGIL, BossTab.CORPOREAL_BEAST, 1),
|
||||||
ARCANE_SIGIL(ItemID.ARCANE_SIGIL, BossTab.CORPOREAL_BEAST, 1),
|
ARCANE_SIGIL(ItemID.ARCANE_SIGIL, BossTab.CORPOREAL_BEAST, 1),
|
||||||
ELYSIAN_SIGIL(ItemID.ELYSIAN_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
|
// The Gauntlet
|
||||||
CRYSTAL_SHARD(ItemID.CRYSTAL_SHARD, BossTab.THE_GAUNTLET, 0),
|
CRYSTAL_SHARD(ItemID.CRYSTAL_SHARD, BossTab.THE_GAUNTLET, 0),
|
||||||
CRYSTAL_WEAPON_SEED(ItemID.CRYSTAL_WEAPON_SEED, 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),
|
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),
|
BUCKET_HELM_G(ItemID.BUCKET_HELM_G, BossTab.CLUE_SCROLL_MASTER, 9),
|
||||||
BOWL_WIG(ItemID.BOWL_WIG, 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;
|
private static final ImmutableMultimap<String, UniqueItem> BOSS_MAP;
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ import net.runelite.client.ui.ColorScheme;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
class LootPanel extends JPanel
|
class LootPanel extends JPanel
|
||||||
{
|
{
|
||||||
|
private final String name;
|
||||||
private final Collection<LTRecord> records;
|
private final Collection<LTRecord> records;
|
||||||
private final Collection<UniqueItem> uniques;
|
private final Collection<UniqueItem> uniques;
|
||||||
private final boolean hideUniques;
|
private final boolean hideUniques;
|
||||||
@@ -64,6 +65,7 @@ class LootPanel extends JPanel
|
|||||||
private boolean cancelPlayback = false;
|
private boolean cancelPlayback = false;
|
||||||
|
|
||||||
LootPanel(
|
LootPanel(
|
||||||
|
final String name,
|
||||||
final Collection<LTRecord> records,
|
final Collection<LTRecord> records,
|
||||||
final Collection<UniqueItem> uniques,
|
final Collection<UniqueItem> uniques,
|
||||||
final boolean hideUnqiues,
|
final boolean hideUnqiues,
|
||||||
@@ -71,6 +73,7 @@ class LootPanel extends JPanel
|
|||||||
final boolean itemBreakdown,
|
final boolean itemBreakdown,
|
||||||
final ItemManager itemManager)
|
final ItemManager itemManager)
|
||||||
{
|
{
|
||||||
|
this.name = name;
|
||||||
this.records = records;
|
this.records = records;
|
||||||
this.uniques = uniques;
|
this.uniques = uniques;
|
||||||
this.hideUniques = hideUnqiues;
|
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.
|
// Also add all Item IDs for uniques to a Set for easy hiding later on.
|
||||||
for (final UniqueItem item : this.uniques)
|
for (final UniqueItem item : this.uniques)
|
||||||
{
|
{
|
||||||
|
|
||||||
final int id = item.getItemID();
|
final int id = item.getItemID();
|
||||||
final int linkedId = item.getLinkedID();
|
final int linkedId = item.getLinkedID();
|
||||||
uniqueIds.add(id);
|
uniqueIds.add(id);
|
||||||
@@ -171,21 +173,60 @@ class LootPanel extends JPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Attach Kill Count Panel(s)
|
// 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));
|
final LTRecord entry = Iterators.get(records.iterator(), (amount - 1));
|
||||||
if (entry.getKillCount() != -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);
|
this.add(p, c);
|
||||||
c.gridy++;
|
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
|
// Track total price of all tracked items for this panel
|
||||||
// Also ensure it is placed in correct location by preserving its gridy value
|
// 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();
|
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());
|
uniques = uniques.stream().sorted(Comparator.comparingInt(UniqueItem::getPosition)).collect(Collectors.toList());
|
||||||
|
|
||||||
final JPanel title = createLootViewTitle(name);
|
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(title, BorderLayout.NORTH);
|
||||||
this.add(wrapContainer(lootPanel), BorderLayout.CENTER);
|
this.add(wrapContainer(lootPanel), BorderLayout.CENTER);
|
||||||
|
|||||||
Reference in New Issue
Block a user