Merge pull request #681 from pklite/loot-tracker-reset

lootracker: added additional functionality [wip]
This commit is contained in:
Tyler Bochard
2019-07-08 19:43:08 -04:00
committed by GitHub
8 changed files with 306 additions and 22 deletions

View File

@@ -0,0 +1,42 @@
/*
* ******************************************************************************
* * Copyright (c) 2019 RuneLitePlus
* * Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file.
* * If there are any questions comments, or feedback about this software, please direct all inquiries directly to the file authors:
* * ST0NEWALL#9112
* * RuneLitePlus Discord: https://discord.gg/Q7wFtCe
* * RuneLitePlus website: https://runelitepl.us
* *****************************************************************************
*/
package net.runelite.client.plugins.loottracker;
import java.time.Duration;
import lombok.Getter;
public enum LootRecordDateFilter
{
HOUR("Hour", Duration.ofHours(1)),
DAY("Day", Duration.ofDays(1)),
WEEK("Week", Duration.ofDays(7)),
MONTH("Month", Duration.ofDays(30)),
YEAR("Year", Duration.ofDays(365)),
ALL("All", Duration.ZERO);
private final String name;
@Getter
private final Duration duration;
private LootRecordDateFilter(String name, Duration duration)
{
this.name = name;
this.duration = duration;
}
@Override
public String toString()
{
return this.name;
}
}

View File

@@ -17,7 +17,7 @@ public enum LootRecordSortType implements Comparator<LootTrackerRecord>
@Override @Override
public int compare(LootTrackerRecord o1, LootTrackerRecord o2) public int compare(LootTrackerRecord o1, LootTrackerRecord o2)
{ {
return Long.compare(o1.getTimestamp(), o2.getTimestamp()); return Long.compare(o1.getTimestamp().toEpochMilli(), o2.getTimestamp().toEpochMilli());
} }
}, },
TOTAL_VALUE TOTAL_VALUE

View File

@@ -32,6 +32,7 @@ import java.awt.GridLayout;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -59,6 +60,7 @@ class LootTrackerBox extends JPanel
private final JPanel itemContainer = new JPanel(); private final JPanel itemContainer = new JPanel();
private final JLabel priceLabel = new JLabel(); private final JLabel priceLabel = new JLabel();
private final JLabel subTitleLabel = new JLabel(); private final JLabel subTitleLabel = new JLabel();
private final JLabel dateLabel = new JLabel();
private final ItemManager itemManager; private final ItemManager itemManager;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
private final String id; private final String id;
@@ -67,16 +69,20 @@ class LootTrackerBox extends JPanel
private final List<LootTrackerRecord> records = new ArrayList<>(); private final List<LootTrackerRecord> records = new ArrayList<>();
private long totalPrice; private long totalPrice;
private final boolean hideIgnoredItems; private boolean hideIgnoredItems;
private final BiConsumer<String, Boolean> onItemToggle; private BiConsumer<String, Boolean> onItemToggle;
private final long timeStamp;
LootTrackerBox( LootTrackerBox(
final long timeStamp,
final ItemManager itemManager, final ItemManager itemManager,
final String id, final String id,
@Nullable final String subtitle, @Nullable final String subtitle,
final boolean hideIgnoredItems, final boolean hideIgnoredItems,
@Nullable final Boolean showDate,
final BiConsumer<String, Boolean> onItemToggle) final BiConsumer<String, Boolean> onItemToggle)
{ {
this.timeStamp = timeStamp;
this.id = id; this.id = id;
this.itemManager = itemManager; this.itemManager = itemManager;
this.onItemToggle = onItemToggle; this.onItemToggle = onItemToggle;
@@ -99,6 +105,15 @@ class LootTrackerBox extends JPanel
subTitleLabel.setForeground(ColorScheme.LIGHT_GRAY_COLOR); subTitleLabel.setForeground(ColorScheme.LIGHT_GRAY_COLOR);
logTitle.add(subTitleLabel, BorderLayout.CENTER); logTitle.add(subTitleLabel, BorderLayout.CENTER);
dateLabel.setFont(FontManager.getRunescapeSmallFont().deriveFont(FontManager.getRunescapeSmallFont().getSize() - 2));
dateLabel.setForeground(Color.LIGHT_GRAY);
dateLabel.setText(new Date(timeStamp).toLocaleString());
if (showDate)
{
logTitle.add(dateLabel, BorderLayout.SOUTH);
}
if (!Strings.isNullOrEmpty(subtitle)) if (!Strings.isNullOrEmpty(subtitle))
{ {
subTitleLabel.setText(subtitle); subTitleLabel.setText(subtitle);
@@ -110,6 +125,7 @@ class LootTrackerBox extends JPanel
add(logTitle, BorderLayout.NORTH); add(logTitle, BorderLayout.NORTH);
add(itemContainer, BorderLayout.CENTER); add(itemContainer, BorderLayout.CENTER);
} }
/** /**

View File

@@ -51,6 +51,25 @@ public interface LootTrackerConfig extends Config
) )
void setIgnoredItems(String key); void setIgnoredItems(String key);
@ConfigItem(
keyName = "ignoredNPCs",
name = "Ignored NPCs",
description = "Configures which NPCs should be ignored ",
position = 1,
group = "Filters"
)
default String getIgnoredNPCs()
{
return "";
}
@ConfigItem(
keyName = "ignoredNPCs",
name = "",
description = ""
)
void setIgnoredNPCs(String key);
@ConfigItem( @ConfigItem(
keyName = "saveLoot", keyName = "saveLoot",
name = "Submit loot tracker data", name = "Submit loot tracker data",
@@ -169,4 +188,24 @@ public interface LootTrackerConfig extends Config
return true; return true;
} }
@ConfigItem(
keyName = "showDeaths",
name = "Show PvP Deaths",
description = "Shows your deaths to help you calculate PvP profit"
)
default boolean showDeaths()
{
return true;
}
@ConfigItem(
keyName = "displayDate",
name = "Display Date",
description = "Displays the date the loot was received"
)
default boolean displayDate()
{
return true;
}
} }

View File

@@ -32,14 +32,18 @@ import java.awt.GridLayout;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Vector;
import javax.inject.Singleton; import javax.inject.Singleton;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.BoxLayout; import javax.swing.BoxLayout;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JMenuItem; import javax.swing.JMenuItem;
import javax.swing.JPanel; import javax.swing.JPanel;
@@ -77,6 +81,10 @@ class LootTrackerPanel extends PluginPanel
private static final ImageIcon VISIBLE_ICON_HOVER; private static final ImageIcon VISIBLE_ICON_HOVER;
private static final ImageIcon INVISIBLE_ICON; private static final ImageIcon INVISIBLE_ICON;
private static final ImageIcon INVISIBLE_ICON_HOVER; private static final ImageIcon INVISIBLE_ICON_HOVER;
private static final ImageIcon RESET_ICON;
private static final ImageIcon RESET_ICON_FADED;
private static final ImageIcon RESET_ICON_HOVER;
private static final String HTML_LABEL_TEMPLATE = private static final String HTML_LABEL_TEMPLATE =
"<html><body style='color:%s'>%s<span style='color:white'>%s</span></body></html>"; "<html><body style='color:%s'>%s<span style='color:white'>%s</span></body></html>";
@@ -100,6 +108,8 @@ class LootTrackerPanel extends PluginPanel
private final JLabel viewHiddenBtn = new JLabel(); private final JLabel viewHiddenBtn = new JLabel();
private final JLabel singleLootBtn = new JLabel(); private final JLabel singleLootBtn = new JLabel();
private final JLabel groupedLootBtn = new JLabel(); private final JLabel groupedLootBtn = new JLabel();
private final JLabel resetIcon = new JLabel();
private JComboBox dateFilterComboBox = new JComboBox<>(new Vector<LootRecordDateFilter>(Arrays.asList(LootRecordDateFilter.values())));
// Log collection // Log collection
private final List<LootTrackerRecord> records = new ArrayList<>(); private final List<LootTrackerRecord> records = new ArrayList<>();
@@ -110,6 +120,7 @@ class LootTrackerPanel extends PluginPanel
private final LootTrackerConfig config; private final LootTrackerConfig config;
private boolean groupLoot; private boolean groupLoot;
private LootRecordDateFilter dateFilter = LootRecordDateFilter.ALL;
private boolean hideIgnoredItems; private boolean hideIgnoredItems;
private String currentView; private String currentView;
@@ -120,11 +131,17 @@ class LootTrackerPanel extends PluginPanel
final BufferedImage backArrowImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "back_icon.png"); final BufferedImage backArrowImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "back_icon.png");
final BufferedImage visibleImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "visible_icon.png"); final BufferedImage visibleImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "visible_icon.png");
final BufferedImage invisibleImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "invisible_icon.png"); final BufferedImage invisibleImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "invisible_icon.png");
final BufferedImage resetImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "reset.png");
SINGLE_LOOT_VIEW = new ImageIcon(singleLootImg); SINGLE_LOOT_VIEW = new ImageIcon(singleLootImg);
SINGLE_LOOT_VIEW_FADED = new ImageIcon(ImageUtil.alphaOffset(singleLootImg, -180)); SINGLE_LOOT_VIEW_FADED = new ImageIcon(ImageUtil.alphaOffset(singleLootImg, -180));
SINGLE_LOOT_VIEW_HOVER = new ImageIcon(ImageUtil.alphaOffset(singleLootImg, -220)); SINGLE_LOOT_VIEW_HOVER = new ImageIcon(ImageUtil.alphaOffset(singleLootImg, -220));
RESET_ICON = new ImageIcon(resetImg);
RESET_ICON_FADED = new ImageIcon(ImageUtil.alphaOffset(resetImg, -180));
RESET_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(resetImg, -220));
GROUPED_LOOT_VIEW = new ImageIcon(groupedLootImg); GROUPED_LOOT_VIEW = new ImageIcon(groupedLootImg);
GROUPED_LOOT_VIEW_FADED = new ImageIcon(ImageUtil.alphaOffset(groupedLootImg, -180)); GROUPED_LOOT_VIEW_FADED = new ImageIcon(ImageUtil.alphaOffset(groupedLootImg, -180));
GROUPED_LOOT_VIEW_HOVER = new ImageIcon(ImageUtil.alphaOffset(groupedLootImg, -220)); GROUPED_LOOT_VIEW_HOVER = new ImageIcon(ImageUtil.alphaOffset(groupedLootImg, -220));
@@ -164,7 +181,7 @@ class LootTrackerPanel extends PluginPanel
actionsContainer.setBorder(new EmptyBorder(5, 5, 5, 10)); actionsContainer.setBorder(new EmptyBorder(5, 5, 5, 10));
actionsContainer.setVisible(false); actionsContainer.setVisible(false);
final JPanel viewControls = new JPanel(new GridLayout(1, 3, 10, 0)); final JPanel viewControls = new JPanel(new GridLayout(1, 5, 5, 0));
viewControls.setBackground(ColorScheme.DARKER_GRAY_COLOR); viewControls.setBackground(ColorScheme.DARKER_GRAY_COLOR);
singleLootBtn.setIcon(SINGLE_LOOT_VIEW); singleLootBtn.setIcon(SINGLE_LOOT_VIEW);
@@ -236,6 +253,43 @@ class LootTrackerPanel extends PluginPanel
} }
}); });
resetIcon.setIcon(RESET_ICON);
resetIcon.setToolTipText("Resets all locally saved data (cannot be undone)");
resetIcon.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
resetRecords();
}
@Override
public void mouseEntered(MouseEvent e)
{
resetIcon.setIcon(RESET_ICON_HOVER);
}
@Override
public void mouseExited(MouseEvent e)
{
resetIcon.setIcon(records.isEmpty() ? RESET_ICON_FADED : RESET_ICON);
}
});
dateFilterComboBox.setSelectedItem(LootRecordDateFilter.ALL);
dateFilterComboBox.setToolTipText("Filter the displayed loot records by date");
dateFilterComboBox.setMaximumSize(new Dimension(15, 0));
dateFilterComboBox.setMaximumRowCount(3);
dateFilterComboBox.addItemListener(e ->
{
final LootRecordDateFilter dateFilterSelected = (LootRecordDateFilter) e.getItem();
dateFilter = dateFilterSelected;
rebuild();
}
);
//viewControls.add(dateFilterComboBox);
viewControls.add(resetIcon);
viewControls.add(groupedLootBtn); viewControls.add(groupedLootBtn);
viewControls.add(singleLootBtn); viewControls.add(singleLootBtn);
viewControls.add(viewHiddenBtn); viewControls.add(viewHiddenBtn);
@@ -276,6 +330,7 @@ class LootTrackerPanel extends PluginPanel
leftTitleContainer.add(backBtn, BorderLayout.WEST); leftTitleContainer.add(backBtn, BorderLayout.WEST);
leftTitleContainer.add(detailsTitle, BorderLayout.CENTER); leftTitleContainer.add(detailsTitle, BorderLayout.CENTER);
actionsContainer.add(dateFilterComboBox);
actionsContainer.add(leftTitleContainer, BorderLayout.WEST); actionsContainer.add(leftTitleContainer, BorderLayout.WEST);
actionsContainer.add(viewControls, BorderLayout.EAST); actionsContainer.add(viewControls, BorderLayout.EAST);
@@ -355,7 +410,7 @@ class LootTrackerPanel extends PluginPanel
void add(final String eventName, final String localUsername, final int actorLevel, LootTrackerItem[] items) void add(final String eventName, final String localUsername, final int actorLevel, LootTrackerItem[] items)
{ {
final String subTitle = actorLevel > -1 ? "(lvl-" + actorLevel + ")" : ""; final String subTitle = actorLevel > -1 ? "(lvl-" + actorLevel + ")" : "";
final LootTrackerRecord record = new LootTrackerRecord( eventName, localUsername, subTitle, items, System.currentTimeMillis()); final LootTrackerRecord record = new LootTrackerRecord( eventName, localUsername, subTitle, items, Instant.now());
records.add(record); records.add(record);
LootTrackerBox box = buildBox(record); LootTrackerBox box = buildBox(record);
if (box != null) if (box != null)
@@ -399,6 +454,21 @@ class LootTrackerPanel extends PluginPanel
viewHiddenBtn.setIcon(hideIgnoredItems ? VISIBLE_ICON : INVISIBLE_ICON); viewHiddenBtn.setIcon(hideIgnoredItems ? VISIBLE_ICON : INVISIBLE_ICON);
} }
/**
* Clears all loaded records. This will also attempt to delete the local storage file
*/
private void resetRecords()
{
records.clear();
boxes.clear();
logsContainer.removeAll();
logsContainer.repaint();
if (config.localPersistence())
{
plugin.deleteLocalRecords();
}
}
/** /**
* After an item changed it's ignored state, iterate all the records and make * After an item changed it's ignored state, iterate all the records and make
* sure all items of the same name also get updated * sure all items of the same name also get updated
@@ -407,6 +477,7 @@ class LootTrackerPanel extends PluginPanel
{ {
for (LootTrackerRecord r : records) for (LootTrackerRecord r : records)
{ {
if (plugin.isIgnoredNPC(r.getTitle()))
for (LootTrackerItem item : r.getItems()) for (LootTrackerItem item : r.getItems())
{ {
if (plugin.isIgnored(item.getName()) != item.isIgnored()) if (plugin.isIgnored(item.getName()) != item.isIgnored())
@@ -436,6 +507,15 @@ class LootTrackerPanel extends PluginPanel
for (int i = start; i < records.size(); i++) for (int i = start; i < records.size(); i++)
{ {
// Check to see if we should even show this record
if (this.hideIgnoredItems)
{
if (this.plugin.isIgnoredNPC(records.get(i).getTitle()))
{
continue;
}
}
if (this.plugin.client.getGameState().equals(GameState.LOGGED_IN)) if (this.plugin.client.getGameState().equals(GameState.LOGGED_IN))
{ {
if (!(this.plugin.client.getLocalPlayer().getName().equals(records.get(i).getLocalUsername()))) if (!(this.plugin.client.getLocalPlayer().getName().equals(records.get(i).getLocalUsername())))
@@ -443,7 +523,15 @@ class LootTrackerPanel extends PluginPanel
continue; continue;
} }
} }
buildBox(records.get(i)); if (this.dateFilter.equals(LootRecordDateFilter.ALL))
{
buildBox(records.get(i));
continue;
}
if (Instant.now().toEpochMilli() - records.get(i).getTimestamp().toEpochMilli() <= this.dateFilter.getDuration().toMillis())
{
buildBox(records.get(i));
}
} }
boxes.forEach(LootTrackerBox::rebuild); boxes.forEach(LootTrackerBox::rebuild);
@@ -476,6 +564,16 @@ class LootTrackerPanel extends PluginPanel
} }
} }
// Check to see if we should even show this record
if (this.hideIgnoredItems)
{
if (this.plugin.isIgnoredNPC(record.getTitle()))
{
return null;
}
}
// Group all similar loot together // Group all similar loot together
if (groupLoot) if (groupLoot)
{ {
@@ -495,8 +593,8 @@ class LootTrackerPanel extends PluginPanel
overallPanel.setVisible(true); overallPanel.setVisible(true);
// Create box // Create box
final LootTrackerBox box = new LootTrackerBox(itemManager, record.getTitle(), record.getSubTitle(), final LootTrackerBox box = new LootTrackerBox(record.getTimestamp().toEpochMilli(), itemManager, record.getTitle(), record.getSubTitle(),
hideIgnoredItems, plugin::toggleItem); hideIgnoredItems, config.displayDate(), plugin::toggleItem);
box.combine(record); box.combine(record);
// Create popup menu // Create popup menu
@@ -504,6 +602,26 @@ class LootTrackerPanel extends PluginPanel
popupMenu.setBorder(new EmptyBorder(5, 5, 5, 5)); popupMenu.setBorder(new EmptyBorder(5, 5, 5, 5));
box.setComponentPopupMenu(popupMenu); box.setComponentPopupMenu(popupMenu);
// Create Hide Menu item
final JMenuItem hide;
if (this.hideIgnoredItems)
{
hide = new JMenuItem("Hide " + box.getId());
}
else
{
hide = new JMenuItem("Unhide " + box.getId());
}
hide.addActionListener(e ->
{
this.plugin.toggleNPC(box.getId(), this.hideIgnoredItems);
rebuild();
});
popupMenu.add(hide);
// Create reset menu // Create reset menu
final JMenuItem reset = new JMenuItem("Reset"); final JMenuItem reset = new JMenuItem("Reset");
reset.addActionListener(e -> reset.addActionListener(e ->
@@ -563,7 +681,14 @@ class LootTrackerPanel extends PluginPanel
{ {
if (!record.getLocalUsername().equals(plugin.client.getLocalPlayer().getName())) if (!record.getLocalUsername().equals(plugin.client.getLocalPlayer().getName()))
{ {
continue;
}
}
if (!dateFilter.equals(LootRecordDateFilter.ALL))
{
if (Instant.now().toEpochMilli() - record.getTimestamp().toEpochMilli()
> this.dateFilter.getDuration().toMillis())
{
continue; continue;
} }
} }

View File

@@ -169,6 +169,7 @@ public class LootTrackerPlugin extends Plugin
private NavigationButton navButton; private NavigationButton navButton;
private String eventType; private String eventType;
private List<String> ignoredItems = new ArrayList<>(); private List<String> ignoredItems = new ArrayList<>();
private List<String> ignoredNPCs = new ArrayList<>();
private Multiset<Integer> inventorySnapshot; private Multiset<Integer> inventorySnapshot;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
private LootTrackerClient lootTrackerClient; private LootTrackerClient lootTrackerClient;
@@ -269,6 +270,11 @@ public class LootTrackerPlugin extends Plugin
ignoredItems = Text.fromCSV(this.getIgnoredItems); ignoredItems = Text.fromCSV(this.getIgnoredItems);
SwingUtilities.invokeLater(panel::updateIgnoredRecords); SwingUtilities.invokeLater(panel::updateIgnoredRecords);
} }
if (event.getKey().equals("ignoredNPCs"))
{
ignoredNPCs = Text.fromCSV(config.getIgnoredNPCs());
SwingUtilities.invokeLater(panel::updateIgnoredRecords);
}
if (event.getKey().equals("sortType")) if (event.getKey().equals("sortType"))
{ {
panel.setLootRecordSortType(this.sortType); panel.setLootRecordSortType(this.sortType);
@@ -281,9 +287,9 @@ public class LootTrackerPlugin extends Plugin
@Override @Override
protected void startUp() throws Exception protected void startUp() throws Exception
{ {
ignoredItems = Text.fromCSV(config.getIgnoredItems());
ignoredNPCs = Text.fromCSV(config.getIgnoredNPCs());
updateConfig(); updateConfig();
ignoredItems = Text.fromCSV(this.getIgnoredItems);
panel = new LootTrackerPanel(this, itemManager, config); panel = new LootTrackerPanel(this, itemManager, config);
spriteManager.getSpriteAsync(SpriteID.TAB_INVENTORY, 0, panel::loadHeaderIcon); spriteManager.getSpriteAsync(SpriteID.TAB_INVENTORY, 0, panel::loadHeaderIcon);
@@ -315,7 +321,6 @@ public class LootTrackerPlugin extends Plugin
executor.submit(() -> executor.submit(() ->
{ {
if (this.syncPanel && lootTrackerClient != null) if (this.syncPanel && lootTrackerClient != null)
{ {
if (accountSession != null) if (accountSession != null)
@@ -406,7 +411,7 @@ public class LootTrackerPlugin extends Plugin
LootRecord lootRecord = new LootRecord(name, localUsername, LootRecordType.NPC, LootRecord lootRecord = new LootRecord(name, localUsername, LootRecordType.NPC,
toGameItems(items), Instant.now()); toGameItems(items), Instant.now());
if (lootTrackerClient != null && this.saveLoot) if (config.saveLoot() && lootTrackerClient != null)
{ {
lootTrackerClient.submit(lootRecord); lootTrackerClient.submit(lootRecord);
} }
@@ -430,7 +435,8 @@ public class LootTrackerPlugin extends Plugin
{ {
if (this.sendLootValueMessages) if (this.sendLootValueMessages)
{ {
if (WorldType.isDeadmanWorld(client.getWorldType()) || WorldType.isHighRiskWorld(client.getWorldType()) || WorldType.isPvpWorld(client.getWorldType()) || client.getVar(Varbits.IN_WILDERNESS) == 1) if (WorldType.isDeadmanWorld(client.getWorldType()) || WorldType.isHighRiskWorld(client.getWorldType()) ||
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());
@@ -453,7 +459,7 @@ public class LootTrackerPlugin extends Plugin
{ {
lootTrackerClient.submit(lootRecord); lootTrackerClient.submit(lootRecord);
} }
if (this.localPersistence && lootTrackerClient == null) if (config.localPersistence())
{ {
saveLocalLootRecord(lootRecord); saveLocalLootRecord(lootRecord);
} }
@@ -537,14 +543,19 @@ public class LootTrackerPlugin extends Plugin
} }
final LootTrackerItem[] entries = buildEntries(stack(items)); final LootTrackerItem[] entries = buildEntries(stack(items));
SwingUtilities.invokeLater(() -> panel.add(eventType, client.getLocalPlayer().getName(), -1, entries)); SwingUtilities.invokeLater(() -> panel.add(eventType, client.getLocalPlayer().getName(), -1, entries));
LootRecord lootRecord = new LootRecord(eventType, client.getLocalPlayer().getName(), LootRecordType.EVENT,
toGameItems(items), Instant.now());
if (lootTrackerClient != null && this.saveLoot) if (lootTrackerClient != null && this.saveLoot)
{ {
LootRecord lootRecord = new LootRecord(eventType, client.getLocalPlayer().getName(), LootRecordType.EVENT,
toGameItems(items), Instant.now());
lootTrackerClient.submit(lootRecord); lootTrackerClient.submit(lootRecord);
} }
if (config.localPersistence())
{
saveLocalLootRecord(lootRecord);
}
} }
@Subscribe @Subscribe
@@ -698,6 +709,20 @@ public class LootTrackerPlugin extends Plugin
} }
} }
public void deleteLocalRecords()
{
try
{
lootRecords.clear();
Files.deleteIfExists(LOOT_RECORDS_FILE.toPath());
}
catch (IOException e)
{
log.debug("Error deleting local loot records file.");
log.debug(Arrays.toString(e.getStackTrace()));
}
}
/** /**
* Takes a snapshot of the local player's inventory and equipment right before respawn. * Takes a snapshot of the local player's inventory and equipment right before respawn.
*/ */
@@ -748,13 +773,18 @@ public class LootTrackerPlugin extends Plugin
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));
if (lootTrackerClient != null && this.saveLoot) LootRecord lootRecord = new LootRecord(chestType, client.getLocalPlayer().getName(),
LootRecordType.EVENT, toGameItems(items), Instant.now());
if (lootTrackerClient != null && config.saveLoot())
{ {
LootRecord lootRecord = new LootRecord(chestType, client.getLocalPlayer().getName(),
LootRecordType.EVENT, toGameItems(items), Instant.now());
lootTrackerClient.submit(lootRecord); lootTrackerClient.submit(lootRecord);
} }
if (config.localPersistence())
{
saveLocalLootRecord(lootRecord);
}
inventorySnapshot = null; inventorySnapshot = null;
} }
} }
@@ -782,6 +812,37 @@ public class LootTrackerPlugin extends Plugin
return ignoredItems.contains(name); return ignoredItems.contains(name);
} }
/**
* Toggles the hidden status for a particular record
* @param name - The String name of the record to toggle the hidden status of
* @param ignore - true to ignore, false to remove
*/
public void toggleNPC(String name, boolean ignore)
{
final Set<String> ignoredNPCSet = new HashSet<>(ignoredNPCs);
if (ignore)
{
ignoredNPCSet.add(name);
}
else
{
ignoredNPCSet.remove(name);
}
config.setIgnoredNPCs(Text.toCSV(ignoredNPCSet));
panel.rebuild();
}
/**
* 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
*/
public boolean isIgnoredNPC(String name)
{
return ignoredNPCs.contains(name);
}
@VisibleForTesting @VisibleForTesting
private LootTrackerItem buildLootTrackerItem(int itemId, int quantity) private LootTrackerItem buildLootTrackerItem(int itemId, int quantity)
{ {
@@ -824,7 +885,7 @@ public class LootTrackerPlugin extends Plugin
).toArray(LootTrackerItem[]::new); ).toArray(LootTrackerItem[]::new);
trackerRecords.add(new LootTrackerRecord(record.getEventId(), record.getUsername(), trackerRecords.add(new LootTrackerRecord(record.getEventId(), record.getUsername(),
"", drops, -1)); "", drops, record.getTime()));
} }
return trackerRecords; return trackerRecords;

View File

@@ -25,6 +25,7 @@
package net.runelite.client.plugins.loottracker; package net.runelite.client.plugins.loottracker;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import java.time.Instant;
import lombok.Value; import lombok.Value;
@Value @Value
@@ -35,7 +36,7 @@ class LootTrackerRecord
private final String subTitle; private final String subTitle;
@SerializedName("item_records") @SerializedName("item_records")
private final LootTrackerItem[] items; private final LootTrackerItem[] items;
private final long timestamp; private final Instant timestamp;
/** /**
* Checks if this record matches specified id * Checks if this record matches specified id

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 B