From 55624a3b8eee496d3d3b07ce98869d640f325ba5 Mon Sep 17 00:00:00 2001 From: Davis Cook Date: Tue, 12 Feb 2019 08:28:48 -0500 Subject: [PATCH] Add ui for tracking slayer tasks --- .../client/events/SlayerAmountChanged.java | 9 - .../client/events/SlayerTaskChanged.java | 9 - .../client/plugins/slayer/SlayerOverlay.java | 2 +- .../client/plugins/slayer/SlayerPlugin.java | 194 ++++++++----- .../plugins/slayer/SlayerTaskPanel.java | 267 ++++++++++++++++- .../plugins/slayer/TargetWeaknessOverlay.java | 2 +- .../client/plugins/slayer/TaskBox.java | 273 ++++++++++++++++++ .../client/plugins/slayer/TaskData.java | 26 ++ .../client/plugins/slayer/panel_icon.png | Bin 0 -> 559 bytes .../plugins/slayer/SlayerPluginTest.java | 112 +++---- 10 files changed, 749 insertions(+), 145 deletions(-) delete mode 100644 runelite-client/src/main/java/net/runelite/client/events/SlayerAmountChanged.java delete mode 100644 runelite-client/src/main/java/net/runelite/client/events/SlayerTaskChanged.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskBox.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskData.java create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/slayer/panel_icon.png diff --git a/runelite-client/src/main/java/net/runelite/client/events/SlayerAmountChanged.java b/runelite-client/src/main/java/net/runelite/client/events/SlayerAmountChanged.java deleted file mode 100644 index af94b6a689..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/events/SlayerAmountChanged.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.runelite.client.events; - -import lombok.Value; - -@Value -public class SlayerAmountChanged -{ - private int oldAmount, newAmount; -} diff --git a/runelite-client/src/main/java/net/runelite/client/events/SlayerTaskChanged.java b/runelite-client/src/main/java/net/runelite/client/events/SlayerTaskChanged.java deleted file mode 100644 index dc87369020..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/events/SlayerTaskChanged.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.runelite.client.events; - -import lombok.Value; - -@Value -public class SlayerTaskChanged -{ - private final String oldTask, newTask; -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java index 675381b1fb..48f70b9a06 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java @@ -125,7 +125,7 @@ class SlayerOverlay extends Overlay return null; } - int amount = plugin.getAmount(); + int amount = plugin.getCurrentTask().getAmount(); if (amount <= 0) { return null; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index 2b786890e2..c8cbf34d1f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -32,6 +32,7 @@ import java.awt.image.BufferedImage; import java.io.IOException; import java.time.Duration; import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -52,6 +53,7 @@ import net.runelite.api.MessageNode; import net.runelite.api.NPC; import net.runelite.api.NPCComposition; import static net.runelite.api.Skill.SLAYER; +import net.runelite.api.SpriteID; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ConfigChanged; @@ -73,14 +75,17 @@ import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.ChatInput; -import net.runelite.client.events.SlayerAmountChanged; -import net.runelite.client.events.SlayerTaskChanged; import net.runelite.client.game.ItemManager; +import net.runelite.client.game.SpriteManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.task.Schedule; +import net.runelite.client.ui.ClientToolbar; +import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.util.ColorUtil; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; import net.runelite.http.api.chat.ChatClient; @@ -128,6 +133,12 @@ public class SlayerPlugin extends Plugin private static final Pattern TASK_STRING_VALIDATION = Pattern.compile("[^a-zA-Z0-9' -]"); private static final int TASK_STRING_MAX_LENGTH = 50; + @Inject + private ClientToolbar clientToolbar; + + @Inject + private SpriteManager spriteManager; + @Inject private Client client; @@ -181,15 +192,7 @@ public class SlayerPlugin extends Plugin @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) - private int amount; - - @Getter(AccessLevel.PACKAGE) - @Setter(AccessLevel.PACKAGE) - private int initialAmount; - - @Getter(AccessLevel.PACKAGE) - @Setter(AccessLevel.PACKAGE) - private String taskLocation; + private TaskData currentTask; @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) @@ -199,10 +202,6 @@ public class SlayerPlugin extends Plugin @Setter(AccessLevel.PACKAGE) private int slaughterChargeCount; - @Getter(AccessLevel.PACKAGE) - @Setter(AccessLevel.PACKAGE) - private String taskName; - @Getter(AccessLevel.PACKAGE) private int streak; @@ -215,6 +214,10 @@ public class SlayerPlugin extends Plugin private boolean loginFlag; private List targetNames = new ArrayList<>(); + private SlayerTaskPanel panel; + private NavigationButton navButton; + private long lastTickMillis = 0; + @Override protected void startUp() throws Exception { @@ -223,6 +226,22 @@ public class SlayerPlugin extends Plugin overlayManager.add(targetWeaknessOverlay); overlayManager.add(targetMinimapOverlay); + panel = new SlayerTaskPanel(this); + spriteManager.getSpriteAsync(SpriteID.SKILL_SLAYER, 0, panel::loadHeaderIcon); + + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "panel_icon.png"); + + navButton = NavigationButton.builder() + .tooltip("Slayer Tracker") + .icon(icon) + .priority(6) + .panel(panel) + .build(); + + clientToolbar.addNavigation(navButton); + System.out.println("================================="); + System.out.println("added slayer nav button"); + if (client.getGameState() == GameState.LOGGED_IN && config.amount() != -1 && !config.taskName().isEmpty()) @@ -231,7 +250,7 @@ public class SlayerPlugin extends Plugin streak = config.streak(); setExpeditiousChargeCount(config.expeditious()); setSlaughterChargeCount(config.slaughter()); - clientThread.invoke(() -> setTask(config.taskName(), config.amount(), config.initialAmount(), config.taskLocation())); + clientThread.invoke(() -> setTask(config.taskName(), config.amount(), config.initialAmount(), true, config.taskLocation())); } chatCommandManager.registerCommandAsync(TASK_COMMAND_STRING, this::taskLookup, this::taskSubmit); @@ -248,6 +267,7 @@ public class SlayerPlugin extends Plugin highlightedTargets.clear(); chatCommandManager.unregisterCommand(TASK_COMMAND_STRING); + clientToolbar.removeNavigation(navButton); } @Provides @@ -264,8 +284,7 @@ public class SlayerPlugin extends Plugin case HOPPING: case LOGGING_IN: cachedXp = 0; - taskName = ""; - amount = 0; + currentTask = new TaskData(0, 0,0, 0, "", "", true); loginFlag = true; highlightedTargets.clear(); break; @@ -278,7 +297,7 @@ public class SlayerPlugin extends Plugin streak = config.streak(); setExpeditiousChargeCount(config.expeditious()); setSlaughterChargeCount(config.slaughter()); - setTask(config.taskName(), config.amount(), config.initialAmount(), config.taskLocation()); + setTask(config.taskName(), config.amount(), config.initialAmount(), true, config.taskLocation()); loginFlag = false; } break; @@ -287,10 +306,10 @@ public class SlayerPlugin extends Plugin private void save() { - config.amount(amount); - config.initialAmount(initialAmount); - config.taskName(taskName); - config.taskLocation(taskLocation); + config.amount(currentTask.getAmount()); + config.initialAmount(currentTask.getInitialAmount()); + config.taskName(currentTask.getTaskName()); + config.taskLocation(currentTask.getTaskLocation()); config.points(points); config.streak(streak); config.expeditious(expeditiousChargeCount); @@ -331,17 +350,17 @@ public class SlayerPlugin extends Plugin String name = mAssign.group("name"); int amount = Integer.parseInt(mAssign.group("amount")); String location = mAssign.group("location"); - setTask(name, amount, amount, location); + setTask(name, amount, amount, true, location); } else if (mAssignFirst.find()) { int amount = Integer.parseInt(mAssignFirst.group(2)); - setTask(mAssignFirst.group(1), amount, amount); + setTask(mAssignFirst.group(1), amount, amount, true); } else if (mAssignBoss.find()) { int amount = Integer.parseInt(mAssignBoss.group(2)); - setTask(mAssignBoss.group(1), amount, amount); + setTask(mAssignBoss.group(1), amount, amount, true); points = Integer.parseInt(mAssignBoss.group(3).replaceAll(",", "")); } else if (mCurrent.find()) @@ -349,7 +368,7 @@ public class SlayerPlugin extends Plugin String name = mCurrent.group("name"); int amount = Integer.parseInt(mCurrent.group("amount")); String location = mCurrent.group("location"); - setTask(name, amount, initialAmount, location); + setTask(name, amount, currentTask.getInitialAmount(), false, location); } } @@ -417,7 +436,7 @@ public class SlayerPlugin extends Plugin { Matcher mSlaughter = CHAT_BRACELET_SLAUGHTER_REGEX.matcher(chatMsg); - amount++; + currentTask.setAmount(currentTask.getAmount() + 1); slaughterChargeCount = mSlaughter.find() ? Integer.parseInt(mSlaughter.group(1)) : SLAUGHTER_CHARGE; config.slaughter(slaughterChargeCount); } @@ -426,7 +445,7 @@ public class SlayerPlugin extends Plugin { Matcher mExpeditious = CHAT_BRACELET_EXPEDITIOUS_REGEX.matcher(chatMsg); - amount--; + currentTask.setAmount(currentTask.getAmount() - 1); expeditiousChargeCount = mExpeditious.find() ? Integer.parseInt(mExpeditious.group(1)) : EXPEDITIOUS_CHARGE; config.expeditious(expeditiousChargeCount); } @@ -480,13 +499,13 @@ public class SlayerPlugin extends Plugin default: log.warn("Unreachable default case for message ending in '; return to Slayer master'"); } - setTask("", 0, 0); + setTask("", 0, 0, true); return; } if (chatMsg.equals(CHAT_GEM_COMPLETE_MESSAGE) || chatMsg.equals(CHAT_CANCEL_MESSAGE) || chatMsg.equals(CHAT_CANCEL_MESSAGE_JAD)) { - setTask("", 0, 0); + setTask("", 0, 0, true); return; } @@ -503,7 +522,7 @@ public class SlayerPlugin extends Plugin String name = mProgress.group("name"); int gemAmount = Integer.parseInt(mProgress.group("amount")); String location = mProgress.group("location"); - setTask(name, gemAmount, initialAmount, location); + setTask(name, gemAmount, currentTask.getInitialAmount(), false, location); return; } @@ -512,10 +531,10 @@ public class SlayerPlugin extends Plugin if (bracerProgress.find()) { final int taskAmount = Integer.parseInt(bracerProgress.group(1)); - setTask(taskName, taskAmount, initialAmount); + setTask(currentTask.getTaskName(), taskAmount, currentTask.getInitialAmount(), false); // Avoid race condition (combat brace message goes through first before XP drop) - amount++; + currentTask.setAmount(currentTask.getAmount() + 1); } } @@ -566,21 +585,22 @@ public class SlayerPlugin extends Plugin @VisibleForTesting void killedOne() { - int oldAmount = amount; - - if (amount == 0) + if (currentTask.getAmount() == 0) { return; } - amount--; + currentTask.setAmount(currentTask.getAmount() - 1); + currentTask.setElapsedKills(currentTask.getElapsedKills() + 1); if (doubleTroubleExtraKill()) { - amount--; + currentTask.setAmount(currentTask.getAmount() - 1); + currentTask.setElapsedKills(currentTask.getElapsedKills() + 1); } - config.amount(amount); // save changed value - eventBus.post(new SlayerAmountChanged(oldAmount, amount)); + config.amount(currentTask.getAmount()); // save changed value + currentTask.setPaused(false); // no longer paused since xp is gained + panel.updateCurrentTask(true, currentTask.isPaused(), currentTask, false); if (!config.showInfobox()) { @@ -589,7 +609,7 @@ public class SlayerPlugin extends Plugin // add and update counter, set timer addCounter(); - counter.setText(String.valueOf(amount)); + counter.setText(String.valueOf(currentTask.getAmount())); infoTimer = Instant.now(); } @@ -643,7 +663,7 @@ public class SlayerPlugin extends Plugin .map(String::toLowerCase) .forEach(targetNames::add); - targetNames.add(taskName.toLowerCase().replaceAll("s$", "")); + targetNames.add(currentTask.getTaskName().toLowerCase().replaceAll("s$", "")); } } @@ -660,38 +680,30 @@ public class SlayerPlugin extends Plugin } } - private void setTask(String name, int amt, int initAmt) + private void setTask(String name, int amt, int initAmt, boolean isNewAssignment) { - setTask(name, amt, initAmt, null); + setTask(name, amt, initAmt, isNewAssignment,null); } - private void setTask(String name, int amt, int initAmt, String location) + private void setTask(String name, int amt, int initAmt, boolean isNewAssignment, String location) { - String oldName = taskName; - - taskName = name; - amount = amt; - initialAmount = initAmt; - taskLocation = location; + currentTask = new TaskData(isNewAssignment ? 0 : currentTask.getElapsedTime(), + isNewAssignment ? 0 : currentTask.getElapsedKills(), + amt, initAmt, location, name, + isNewAssignment ? true : currentTask.isPaused()); + panel.updateCurrentTask(true, currentTask.isPaused(), currentTask, isNewAssignment); save(); removeCounter(); addCounter(); infoTimer = Instant.now(); - eventBus.post(new SlayerTaskChanged(oldName, taskName)); Task task = Task.getTask(name); rebuildTargetNames(task); rebuildTargetList(); } - private void addCounter() + public BufferedImage getImageForTask(Task task) { - if (!config.showInfobox() || counter != null || Strings.isNullOrEmpty(taskName)) - { - return; - } - - Task task = Task.getTask(taskName); int itemSpriteId = ItemID.ENCHANTED_GEM; if (task != null) { @@ -699,11 +711,23 @@ public class SlayerPlugin extends Plugin } BufferedImage taskImg = itemManager.getImage(itemSpriteId); + return taskImg; + } + + private void addCounter() + { + if (!config.showInfobox() || counter != null || Strings.isNullOrEmpty(currentTask.getTaskName())) + { + return; + } + + Task task = Task.getTask(currentTask.getTaskName()); + BufferedImage taskImg = getImageForTask(task); String taskTooltip = ColorUtil.wrapWithColorTag("%s", new Color(255, 119, 0)) + "
"; - if (taskLocation != null && !taskLocation.isEmpty()) + if (currentTask.getTaskLocation() != null && !currentTask.getTaskLocation().isEmpty()) { - taskTooltip += taskLocation + "
"; + taskTooltip += currentTask.getTaskLocation() + "
"; } taskTooltip += ColorUtil.wrapWithColorTag("Pts:", Color.YELLOW) @@ -711,15 +735,15 @@ public class SlayerPlugin extends Plugin + ColorUtil.wrapWithColorTag("Streak:", Color.YELLOW) + " %s"; - if (initialAmount > 0) + if (currentTask.getInitialAmount() > 0) { taskTooltip += "
" + ColorUtil.wrapWithColorTag("Start:", Color.YELLOW) - + " " + initialAmount; + + " " + currentTask.getInitialAmount(); } - counter = new TaskCounter(taskImg, this, amount); - counter.setTooltip(String.format(taskTooltip, capsString(taskName), points, streak)); + counter = new TaskCounter(taskImg, this, currentTask.getAmount()); + counter.setTooltip(String.format(taskTooltip, capsString(currentTask.getTaskName()), points, streak)); infoBoxManager.addInfoBox(counter); } @@ -806,7 +830,7 @@ public class SlayerPlugin extends Plugin private boolean taskSubmit(ChatInput chatInput, String value) { - if (Strings.isNullOrEmpty(taskName)) + if (Strings.isNullOrEmpty(currentTask.getTaskName())) { return false; } @@ -817,7 +841,8 @@ public class SlayerPlugin extends Plugin { try { - chatClient.submitTask(playerName, capsString(taskName), amount, initialAmount, taskLocation); + chatClient.submitTask(playerName, capsString(currentTask.getTaskName()), currentTask.getAmount(), + currentTask.getInitialAmount(), currentTask.getTaskLocation()); } catch (Exception ex) { @@ -832,6 +857,39 @@ public class SlayerPlugin extends Plugin return true; } + /* package access method for changing the pause state of the time tracker for the current task */ + void setPaused(boolean paused) + { + currentTask.setPaused(paused); + panel.updateCurrentTask(false, currentTask.isPaused(), currentTask, false); + } + + @Schedule( + period = 1, + unit = ChronoUnit.SECONDS + ) + public void tickTaskTimes() + { + if (lastTickMillis == 0) + { + lastTickMillis = System.currentTimeMillis(); + return; + } + + final long nowMillis = System.currentTimeMillis(); + final long tickDelta = nowMillis - lastTickMillis; + lastTickMillis = nowMillis; + + + if (currentTask == null) + { + return; + } + currentTask.tick(tickDelta); + + panel.updateCurrentTask(false, currentTask.isPaused(), currentTask, false); + } + //Utils private String capsString(String str) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerTaskPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerTaskPanel.java index b3441a6647..48d3fb98da 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerTaskPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerTaskPanel.java @@ -1,6 +1,271 @@ package net.runelite.client.plugins.slayer; -public class SlayerTaskPanel +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.image.BufferedImage; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; +import net.runelite.client.ui.ColorScheme; +import net.runelite.client.ui.FontManager; +import net.runelite.client.ui.PluginPanel; +import net.runelite.client.ui.components.PluginErrorPanel; +import net.runelite.client.util.ColorUtil; +import net.runelite.client.util.StackFormatter; + +public class SlayerTaskPanel extends PluginPanel { + private static final long MILLIS_PER_SECOND = 1000; + private static final long SECONDS_PER_MINUTE = 60; + private static final long MINUTES_PER_HOUR = 60; + + // Templates + private static final String HTML_LABEL_TEMPLATE = + "%s%s"; + private static final String HTML_TIME_LABEL_TEMPLATE = + "%s%02d:%02d:%02d"; + + + // TODO: set some kind of maximum for the amount of tasks to be tracked in a session + private static final int MAX_TASK_BOXES = 50; + + // When there are no tasks, display this + private final PluginErrorPanel errorPanel = new PluginErrorPanel(); + + // Handle task boxes + private final JPanel tasksContainer = new JPanel(); + + // Handle overall slayer session data + private final JPanel overallPanel = new JPanel(); + private final JLabel overallKillsLabel = new JLabel(); + private final JLabel overallTimeLabel = new JLabel(); + private final JLabel overallIcon = new JLabel(); + + // Actions + private final JPanel actionsContainer = new JPanel(); + private final JLabel playBtn = new JLabel(); + private final JLabel pauseBtn = new JLabel(); + + // Log tasks + private final List tasks = new ArrayList<>(); + + private SlayerPlugin slayerPlugin; + + public SlayerTaskPanel(SlayerPlugin slayerPlugin) + { + this.slayerPlugin = slayerPlugin; + + setBorder(new EmptyBorder(6, 6, 6, 6)); + setBackground(ColorScheme.DARK_GRAY_COLOR); + setLayout(new BorderLayout()); + + // Create layout panel for wrapping + final JPanel layoutPanel = new JPanel(); + layoutPanel.setLayout(new BoxLayout(layoutPanel, BoxLayout.Y_AXIS)); + add(layoutPanel, BorderLayout.NORTH); + + actionsContainer.setLayout(new GridLayout(1, 2, 10, 0)); + actionsContainer.setBackground(ColorScheme.DARKER_GRAY_COLOR); + actionsContainer.setPreferredSize(new Dimension(0, 30)); + actionsContainer.setBorder(new EmptyBorder(5, 5, 5, 10)); + actionsContainer.setVisible(false); + + playBtn.setText("->"); + playBtn.setToolTipText("Resume the current slayer task"); + playBtn.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent mouseEvent) + { + slayerPlugin.setPaused(false); + } + }); + + pauseBtn.setText("||"); + pauseBtn.setToolTipText("Pause the current slayer task"); + pauseBtn.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent mouseEvent) + { + slayerPlugin.setPaused(true); + } + }); + + actionsContainer.add(playBtn); + actionsContainer.add(pauseBtn); + + // Create panel that will contain overall data + overallPanel.setBorder(new EmptyBorder(8, 10, 8, 10)); + overallPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); + overallPanel.setLayout(new BorderLayout()); + overallPanel.setVisible(false); + + // Add contents + final JPanel overallInfo = new JPanel(); + overallInfo.setBackground(ColorScheme.DARKER_GRAY_COLOR); + overallInfo.setLayout(new GridLayout(2, 1)); + overallInfo.setBorder(new EmptyBorder(2, 10, 2, 0)); + overallKillsLabel.setFont(FontManager.getRunescapeSmallFont()); + overallTimeLabel.setFont(FontManager.getRunescapeSmallFont()); + overallInfo.add(overallKillsLabel); + overallInfo.add(overallTimeLabel); + overallPanel.add(overallIcon, BorderLayout.WEST); + overallPanel.add(overallInfo, BorderLayout.CENTER); + + tasksContainer.setLayout(new BoxLayout(tasksContainer, BoxLayout.Y_AXIS)); + layoutPanel.add(actionsContainer); + layoutPanel.add(Box.createRigidArea(new Dimension(0, 5))); + layoutPanel.add(overallPanel); + layoutPanel.add(tasksContainer); + + // Add error pane + errorPanel.setContent("Task trackers", "You have not received any slayer tasks yet."); + add(errorPanel); + } + + void loadHeaderIcon(BufferedImage img) + { + overallIcon.setIcon(new ImageIcon(img)); + } + + private void updateOverall() + { + int overallKills = 0; + long overallTime = 0; + for (TaskBox box : tasks) + { + overallKills += box.getTaskData().getElapsedKills(); + overallTime += box.getTaskData().getElapsedTime(); + } + + overallKillsLabel.setText(htmlLabel("Total kills: ", overallKills)); + overallTimeLabel.setText(htmlLabel("Total time: ", overallTime)); + } + + private static boolean isEmptyTask(TaskData taskData) + { + return taskData.getTaskName().equals("") && taskData.getAmount() == 0 && taskData.getInitialAmount() == 0; + } + + private void showMainView() + { + remove(errorPanel); + actionsContainer.setVisible(true); + overallPanel.setVisible(true); + } + + private TaskBox buildBox(SlayerPlugin plugin, JPanel container, TaskData data) + { + TaskBox newBox = new TaskBox(plugin, container, data.toBuilder().build()); + tasks.add(0, newBox); + showMainView(); + return newBox; + } + + void updateCurrentTask(boolean updated, boolean paused, TaskData newData, boolean isNewAssignment) + { + // important case for if the current task is completed so the update will show the empty task + if (isEmptyTask(newData)) + { + if (tasks.isEmpty()) // if there is no current task an empty task doesn't do anything + { + return; + } + System.out.println("empty task sent so ending current task"); + TaskBox current = tasks.get(0); + // current task has ended so it should be paused + current.update(true, true, current.getTaskData()); + return; + } + + if (tasks.isEmpty() || isNewAssignment) + { + System.out.println("new task is set"); + + // new task so append it to the front of the list + SwingUtilities.invokeLater(() -> { + TaskBox newBox = buildBox(slayerPlugin, tasksContainer, newData); + newBox.update(true, newData.isPaused(), newData); + }); + return; + } + else + { + // if here there is a current task so check if the current task matches + // the update being sent + TaskBox current = tasks.get(0); + System.out.println("current task: " + current.getTaskData().getTaskName() + " " + + current.getTaskData().getTaskLocation() + " " + current.getTaskData().getInitialAmount()); + System.out.println("new task: " + newData.getTaskName() + " " + newData.getTaskLocation() + + " " + newData.getInitialAmount()); + if (!current.getTaskData().getTaskName().equals(newData.getTaskName()) || + !current.getTaskData().getTaskLocation().equals(newData.getTaskLocation()) || + current.getTaskData().getInitialAmount() != newData.getInitialAmount()) + { + // current task does not match the update being sent so the current task + // must have been outdated - this is necessarily true because if a true + // new task was sent it would have set the isNewAssignment flag + System.out.println("task does not match must create new match"); + + // so this previous task is invalid so delete it then add in the new actually + // correct task + SwingUtilities.invokeLater(() -> { + tasksContainer.remove(tasks.get(0)); + tasks.remove(0); + TaskBox newBox = buildBox(slayerPlugin, tasksContainer, newData); + newBox.update(true, newData.isPaused(), newData); + }); + return; + } + } + + System.out.println("simply updating task"); + System.out.println("task panel size = " + tasks.size()); + System.out.println("task elapsed time " + tasks.get(0).getTaskData().getElapsedTime()); + System.out.println("task elapsed kills " + tasks.get(0).getTaskData().getElapsedKills()); + // not an empty assignment or a new assignment so just update the current assignment + TaskBox current = tasks.get(0); + current.update(updated, paused, newData); + + // update the overall stats once this task stats are updated + updateOverall(); + } + + static String htmlLabel(String key, long timeMillis) + { + if (timeMillis == Long.MAX_VALUE) + { + String valueStr = "N/A"; + return String.format(HTML_LABEL_TEMPLATE, ColorUtil.toHexColor(ColorScheme.LIGHT_GRAY_COLOR), + key, valueStr); + } + else + { + long seconds = timeMillis / MILLIS_PER_SECOND; + long minutes = seconds / SECONDS_PER_MINUTE; + seconds %= 60; + long hours = minutes / MINUTES_PER_HOUR; + minutes %= 60; + return String.format(HTML_TIME_LABEL_TEMPLATE, ColorUtil.toHexColor(ColorScheme.LIGHT_GRAY_COLOR), + key, (int) hours, (int) minutes, (int) seconds); + } + } + + static String htmlLabel(String key, int value) + { + String valueStr = StackFormatter.quantityToRSDecimalStack(value); + return String.format(HTML_LABEL_TEMPLATE, ColorUtil.toHexColor(ColorScheme.LIGHT_GRAY_COLOR), + key, valueStr); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java index 5521380e57..1b8973fbce 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java @@ -72,7 +72,7 @@ class TargetWeaknessOverlay extends Overlay return null; } - final Task curTask = Task.getTask(plugin.getTaskName()); + final Task curTask = Task.getTask(plugin.getCurrentTask().getTaskName()); if (curTask == null || curTask.getWeaknessThreshold() < 0 || curTask.getWeaknessItem() < 0) { return null; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskBox.java new file mode 100644 index 0000000000..1cbbfb32ca --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskBox.java @@ -0,0 +1,273 @@ +package net.runelite.client.plugins.slayer; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.image.BufferedImage; +import java.text.DecimalFormat; +import java.util.Collections; +import javax.swing.JLabel; +import javax.swing.ImageIcon; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.border.EmptyBorder; +import lombok.AccessLevel; +import lombok.Getter; +import net.runelite.client.ui.ColorScheme; +import net.runelite.client.ui.DynamicGridLayout; +import net.runelite.client.ui.FontManager; +import net.runelite.client.ui.components.ProgressBar; +import net.runelite.client.util.ColorUtil; +import net.runelite.client.util.StackFormatter; + +public class TaskBox extends JPanel +{ + private static final long MILLIS_PER_SECOND = 1000; + private static final long SECONDS_PER_MINUTE = 60; + private static final long MINUTES_PER_HOUR = 60; + private static final long MILLIS_PER_HOUR = MILLIS_PER_SECOND * SECONDS_PER_MINUTE * MINUTES_PER_HOUR; + + private static final DecimalFormat TWO_DECIMAL_FORMAT = new DecimalFormat("0.00"); + + + // Templates + private static final String HTML_TOOL_TIP_TEMPLATE = + "%.1f Kills/hr
" + + "%02d:%02d:%02d per kill"; + private static final String HTML_LABEL_TEMPLATE = + "%s%s"; + private static final String HTML_TIME_LABEL_TEMPLATE = + "%s%02d:%02d:%02d"; + + // Instance members + private final JPanel panel; + + @Getter(AccessLevel.PACKAGE) + private final TaskData taskData; + + /* This task's wrapping container */ + private final JPanel container = new JPanel(); + + /* Contains the task icon and the stats panel */ + private final JPanel headerPanel = new JPanel(); + + /* Contains the overall stats of the slayer task */ + private final JPanel statsPanel = new JPanel(); + + private final ProgressBar progressBar = new ProgressBar(); + + private final JLabel currentDuration = new JLabel(); + private final JLabel remainingDuration = new JLabel(); + private final JLabel currentKills = new JLabel(); + private final JLabel remainingKills = new JLabel(); + + private boolean paused = false; + + public TaskBox(SlayerPlugin slayerPlugin, JPanel panel, TaskData taskData) + { + this.panel = panel; + this.taskData = taskData; + + setLayout(new BorderLayout()); + setBorder(new EmptyBorder(5, 0, 0, 0)); + + container.setLayout(new BorderLayout()); + container.setBackground(ColorScheme.DARKER_GRAY_COLOR); + + BufferedImage taskImg = slayerPlugin.getImageForTask(Task.getTask(taskData.getTaskName())); + JLabel taskIcon = new JLabel(new ImageIcon(taskImg)); + taskIcon.setHorizontalAlignment(SwingConstants.CENTER); + taskIcon.setVerticalAlignment(SwingConstants.CENTER); + taskIcon.setPreferredSize(new Dimension(35, 35)); + + headerPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); + headerPanel.setLayout(new BorderLayout()); + + statsPanel.setLayout(new DynamicGridLayout(2, 2)); + statsPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); + statsPanel.setBorder(new EmptyBorder(9, 2, 9, 2)); + + currentDuration.setFont(FontManager.getRunescapeSmallFont()); + remainingDuration.setFont(FontManager.getRunescapeSmallFont()); + currentKills.setFont(FontManager.getRunescapeSmallFont()); + remainingKills.setFont(FontManager.getRunescapeSmallFont()); + + statsPanel.add(currentDuration); + statsPanel.add(currentKills); + statsPanel.add(remainingDuration); + statsPanel.add(remainingKills); + + headerPanel.add(taskIcon, BorderLayout.WEST); + headerPanel.add(statsPanel, BorderLayout.CENTER); + + JPanel progressWrapper = new JPanel(); + progressWrapper.setBackground(ColorScheme.DARKER_GRAY_COLOR); + progressWrapper.setLayout(new BorderLayout()); + progressWrapper.setBorder(new EmptyBorder(0, 7, 7, 7)); + + + progressBar.setMaximumValue(100); + progressBar.setBackground(new Color(61, 56, 49)); + progressBar.setForeground(new Color(98, 70, 70)); + progressBar.setDimmedText("Paused"); + + progressWrapper.add(progressBar, BorderLayout.NORTH); + + final JPanel logTitle = new JPanel(new BorderLayout(5, 0)); + logTitle.setBorder(new EmptyBorder(7, 7, 7, 7)); + logTitle.setBackground(ColorScheme.DARKER_GRAY_COLOR.darker()); + + String taskName = taskData.getTaskName(); + taskName = taskName.substring(0, 1).toUpperCase() + taskName.substring(1); + final JLabel titleLabel = new JLabel(taskName); + titleLabel.setFont(FontManager.getRunescapeSmallFont()); + titleLabel.setForeground(Color.WHITE); + + logTitle.add(titleLabel, BorderLayout.WEST); + + final JLabel subTitleLabel = new JLabel("x " + taskData.getInitialAmount()); + subTitleLabel.setFont(FontManager.getRunescapeSmallFont()); + subTitleLabel.setForeground(ColorScheme.LIGHT_GRAY_COLOR); + + logTitle.add(subTitleLabel, BorderLayout.CENTER); + + if (taskData.getTaskLocation() != null && !taskData.getTaskLocation().equals("")) + { + final JLabel locationLabel = new JLabel(taskData.getTaskLocation()); + locationLabel.setFont(FontManager.getRunescapeSmallFont()); + locationLabel.setForeground(ColorScheme.LIGHT_GRAY_COLOR); + + logTitle.add(locationLabel, BorderLayout.EAST); + } + + container.add(logTitle, BorderLayout.NORTH); + container.add(headerPanel, BorderLayout.CENTER); + container.add(progressWrapper, BorderLayout.SOUTH); + + add(container, BorderLayout.NORTH); + } + + void update(boolean updated, boolean paused, TaskData newData) + { + SwingUtilities.invokeLater(() -> rebuildAsync(updated, paused, newData)); + } + + private void rebuildAsync(boolean updated, boolean taskPaused, TaskData newData) + { + if (updated) + { + if (getParent() != panel) + { + panel.add(this); + panel.revalidate(); + } + + // Update data + taskData.setElapsedKills(newData.getElapsedKills()); + taskData.setAmount(newData.getAmount()); + + // Update information labels + int kills = taskData.getInitialAmount() - taskData.getAmount(); + currentKills.setText(htmlLabel("Elapsed Kills: ", taskData.getElapsedKills())); + remainingKills.setText(htmlLabel("Remaining Kills: ", taskData.getAmount())); + + // Update progress bar + double percentComplete = ((double) kills) / ((double) taskData.getInitialAmount()); + progressBar.setValue((int) (percentComplete * 100)); + progressBar.setCenterLabel(TWO_DECIMAL_FORMAT.format(percentComplete * 100) + "%"); + progressBar.setLeftLabel("0 Kc"); + progressBar.setRightLabel(taskData.getInitialAmount() + " Kc"); + progressBar.setPositions(Collections.emptyList()); + + double killsPerMillis = ((double) taskData.getElapsedKills() - 1) / ((double) taskData.getElapsedTime()); + if (killsPerMillis <= 0) + { + progressBar.setToolTipText(String.format( + HTML_TOOL_TIP_TEMPLATE, + 0, + 99, + 99, + 99 + )); + } + double killsPerHour = killsPerMillis * MILLIS_PER_HOUR; + double millisPerKill = 1.0 / killsPerMillis; + long seconds = ((long) millisPerKill) / MILLIS_PER_SECOND; + long minutes = seconds / SECONDS_PER_MINUTE; + seconds %= 60; + long hours = minutes / MINUTES_PER_HOUR; + minutes %= 60; + progressBar.setToolTipText(String.format( + HTML_TOOL_TIP_TEMPLATE, + killsPerHour, + hours, + minutes, + seconds + )); + + progressBar.setDimmed(taskPaused); + + progressBar.repaint(); + } + else if (!paused && taskPaused) + { + progressBar.setDimmed(true); + progressBar.repaint(); + paused = true; + } + else if (paused && !taskPaused) + { + progressBar.setDimmed(false); + progressBar.repaint(); + paused = false; + } + + // Update duration separately, every time (not only when there's an update) + taskData.setElapsedTime(newData.getElapsedTime()); + currentDuration.setText(htmlLabel("Elapsed Time: ", taskData.getElapsedTime())); + remainingDuration.setText(htmlLabel("Remaining Time: ", estimateRemainingTime(taskData))); + + repaint(); + } + + static long estimateRemainingTime(TaskData taskData) + { + int kills = taskData.getElapsedKills(); + int killsInElapsedTime = kills - 1; // b/c time only elapses after 1st slayer drop + if (killsInElapsedTime < 1) + { + return Long.MAX_VALUE; + } + double timePerKill = ((double) taskData.getElapsedTime()) / ((double) killsInElapsedTime); + double remainingTime = timePerKill * taskData.getAmount(); + return (long) remainingTime; + } + + static String htmlLabel(String key, long timeMillis) + { + if (timeMillis == Long.MAX_VALUE) + { + String valueStr = "N/A"; + return String.format(HTML_LABEL_TEMPLATE, ColorUtil.toHexColor(ColorScheme.LIGHT_GRAY_COLOR), + key, valueStr); + } + else + { + long seconds = timeMillis / MILLIS_PER_SECOND; + long minutes = seconds / SECONDS_PER_MINUTE; + seconds %= 60; + long hours = minutes / MINUTES_PER_HOUR; + minutes %= 60; + return String.format(HTML_TIME_LABEL_TEMPLATE, ColorUtil.toHexColor(ColorScheme.LIGHT_GRAY_COLOR), + key, (int) hours, (int) minutes, (int) seconds); + } + } + + static String htmlLabel(String key, int value) + { + String valueStr = StackFormatter.quantityToRSDecimalStack(value); + return String.format(HTML_LABEL_TEMPLATE, ColorUtil.toHexColor(ColorScheme.LIGHT_GRAY_COLOR), + key, valueStr); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskData.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskData.java new file mode 100644 index 0000000000..c76f8cf3c7 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TaskData.java @@ -0,0 +1,26 @@ +package net.runelite.client.plugins.slayer; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@AllArgsConstructor +@Builder(toBuilder=true) +public class TaskData +{ + private long elapsedTime; + private int elapsedKills; + private int amount, initialAmount; + private String taskLocation; + private String taskName; + private boolean paused; + + public void tick(long delta) + { + if (!paused) + { + elapsedTime += delta; + } + } +} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/slayer/panel_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/slayer/panel_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cd454c3956cea4b004a8a6bc43bdb3a09a9e0ac9 GIT binary patch literal 559 zcmV+~0?_@5P)KZkOi~9Gew60`@b-SK+$Xz{J1R4Cb%Ct#;T{06*{sB~$#f30lad{1 za7J-7G@xa_F2G!y%?gw0T+7@FPrpU~GR$ zTrWTz4Uz6vEoe>$FJ@x}z`H}wnrN#e69Xvwb;`&*UF3R!Vhf-aPzE#R?A=|?HgWg# z3;<}fdZ<+^qJSLC)o+JZII|UU&}kZhjF)#=6K%1Wjd#UWd}q{eKT;fx#2_N^%a!zh zIG7l_U= zGUq|`mL%GWp{rEPi=E2dW9^oG;(=W+FoMaaR{R(0EhTSLhi0kl*9ExW4$)}!)NhL| xfUM>3T6oXb^K~*9AZC0Ot*IFzW?!H5`ai?J8;7*`o`3)V002ovPDHLkV1n*!{BQsO literal 0 HcmV?d00001 diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java index 6bfa00f4f2..37acacfbb7 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java @@ -171,8 +171,8 @@ public class SlayerPluginTest when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); slayerPlugin.onGameTick(new GameTick()); - assertEquals("Suqahs", slayerPlugin.getTaskName()); - assertEquals(231, slayerPlugin.getAmount()); + assertEquals("Suqahs", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(231, slayerPlugin.getCurrentTask().getAmount()); } @Test @@ -183,9 +183,9 @@ public class SlayerPluginTest when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); slayerPlugin.onGameTick(new GameTick()); - assertEquals("Wyrms", slayerPlugin.getTaskName()); - assertEquals(147, slayerPlugin.getAmount()); - assertEquals("Karuulm Slayer Dungeon", slayerPlugin.getTaskLocation()); + assertEquals("Wyrms", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(147, slayerPlugin.getCurrentTask().getAmount()); + assertEquals("Karuulm Slayer Dungeon", slayerPlugin.getCurrentTask().getTaskLocation()); } @Test @@ -196,9 +196,9 @@ public class SlayerPluginTest when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); slayerPlugin.onGameTick(new GameTick()); - assertEquals("Hellhounds", slayerPlugin.getTaskName()); - assertEquals(142, slayerPlugin.getAmount()); - assertEquals("Witchhaven Dungeon", slayerPlugin.getTaskLocation()); + assertEquals("Hellhounds", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(142, slayerPlugin.getCurrentTask().getAmount()); + assertEquals("Witchhaven Dungeon", slayerPlugin.getCurrentTask().getTaskLocation()); } @Test @@ -209,8 +209,8 @@ public class SlayerPluginTest when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); slayerPlugin.onGameTick(new GameTick()); - assertEquals("goblins", slayerPlugin.getTaskName()); - assertEquals(17, slayerPlugin.getAmount()); + assertEquals("goblins", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(17, slayerPlugin.getCurrentTask().getAmount()); } @Test @@ -221,8 +221,8 @@ public class SlayerPluginTest when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); slayerPlugin.onGameTick(new GameTick()); - assertEquals("Suqahs", slayerPlugin.getTaskName()); - assertEquals(211, slayerPlugin.getAmount()); + assertEquals("Suqahs", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(211, slayerPlugin.getCurrentTask().getAmount()); } @Test @@ -233,8 +233,8 @@ public class SlayerPluginTest when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); slayerPlugin.onGameTick(new GameTick()); - assertEquals("Vet'ion", slayerPlugin.getTaskName()); - assertEquals(3, slayerPlugin.getAmount()); + assertEquals("Vet'ion", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(3, slayerPlugin.getCurrentTask().getAmount()); assertEquals(914, slayerPlugin.getPoints()); } @@ -246,8 +246,8 @@ public class SlayerPluginTest when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); slayerPlugin.onGameTick(new GameTick()); - assertEquals("Chaos Elemental", slayerPlugin.getTaskName()); - assertEquals(3, slayerPlugin.getAmount()); + assertEquals("Chaos Elemental", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(3, slayerPlugin.getCurrentTask().getAmount()); assertEquals(914, slayerPlugin.getPoints()); } @@ -257,8 +257,8 @@ public class SlayerPluginTest ChatMessage chatMessageEvent = new ChatMessage(null, SERVER, "", TASK_NEW_FROM_PARTNER, null, 0); slayerPlugin.onChatMessage(chatMessageEvent); - assertEquals("Dust Devils", slayerPlugin.getTaskName()); - assertEquals(377, slayerPlugin.getAmount()); + assertEquals("Dust Devils", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(377, slayerPlugin.getCurrentTask().getAmount()); } @Test @@ -266,8 +266,8 @@ public class SlayerPluginTest { ChatMessage chatMessageEvent = new ChatMessage(null, SERVER, "", TASK_CHECKSLAYERGEM, null, 0); slayerPlugin.onChatMessage(chatMessageEvent); - assertEquals("Suqahs", slayerPlugin.getTaskName()); - assertEquals(211, slayerPlugin.getAmount()); + assertEquals("Suqahs", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(211, slayerPlugin.getCurrentTask().getAmount()); } @Test @@ -275,9 +275,9 @@ public class SlayerPluginTest { ChatMessage chatMessageEvent = new ChatMessage(null, SERVER, "", TASK_CHECKSLAYERGEM_WILDERNESS, null, 0); slayerPlugin.onChatMessage(chatMessageEvent); - assertEquals("Suqahs", slayerPlugin.getTaskName()); - assertEquals(211, slayerPlugin.getAmount()); - assertEquals("Wilderness", slayerPlugin.getTaskLocation()); + assertEquals("Suqahs", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(211, slayerPlugin.getCurrentTask().getAmount()); + assertEquals("Wilderness", slayerPlugin.getCurrentTask().getTaskLocation()); } @Test @@ -286,9 +286,9 @@ public class SlayerPluginTest ChatMessage chatMessageEvent = new ChatMessage(null, SERVER, "", TASK_CHECKSLAYERGEM_KONAR, null, 0); slayerPlugin.onChatMessage(chatMessageEvent); - assertEquals("Blue dragons", slayerPlugin.getTaskName()); - assertEquals(122, slayerPlugin.getAmount()); - assertEquals("Ogre Enclave", slayerPlugin.getTaskLocation()); + assertEquals("Blue dragons", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(122, slayerPlugin.getCurrentTask().getAmount()); + assertEquals("Ogre Enclave", slayerPlugin.getCurrentTask().getTaskLocation()); } @Test @@ -299,8 +299,8 @@ public class SlayerPluginTest when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); slayerPlugin.onGameTick(new GameTick()); - assertEquals("suqahs", slayerPlugin.getTaskName()); - assertEquals(222, slayerPlugin.getAmount()); + assertEquals("suqahs", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(222, slayerPlugin.getCurrentTask().getAmount()); } @Test @@ -325,8 +325,8 @@ public class SlayerPluginTest slayerPlugin.onChatMessage(chatMessageEvent); assertEquals(1, slayerPlugin.getStreak()); - assertEquals("", slayerPlugin.getTaskName()); - assertEquals(0, slayerPlugin.getAmount()); + assertEquals("", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); } @Test @@ -336,8 +336,8 @@ public class SlayerPluginTest slayerPlugin.onChatMessage(chatMessageEvent); assertEquals(3, slayerPlugin.getStreak()); - assertEquals("", slayerPlugin.getTaskName()); - assertEquals(0, slayerPlugin.getAmount()); + assertEquals("", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); } @Test @@ -347,8 +347,8 @@ public class SlayerPluginTest slayerPlugin.onChatMessage(chatMessageEvent); assertEquals(9, slayerPlugin.getStreak()); - assertEquals("", slayerPlugin.getTaskName()); - assertEquals(0, slayerPlugin.getAmount()); + assertEquals("", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); assertEquals(18_000, slayerPlugin.getPoints()); } @@ -359,35 +359,35 @@ public class SlayerPluginTest slayerPlugin.onChatMessage(chatMessageEvent); assertEquals(2465, slayerPlugin.getStreak()); - assertEquals("", slayerPlugin.getTaskName()); - assertEquals(0, slayerPlugin.getAmount()); + assertEquals("", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); assertEquals(17_566_000, slayerPlugin.getPoints()); } @Test public void testComplete() { - slayerPlugin.setTaskName("cows"); - slayerPlugin.setAmount(42); + slayerPlugin.getCurrentTask().setTaskName("cows"); + slayerPlugin.getCurrentTask().setAmount(42); ChatMessage chatMessageEvent = new ChatMessage(null, SERVER, "Perterter", TASK_COMPLETE, null, 0); slayerPlugin.onChatMessage(chatMessageEvent); - assertEquals("", slayerPlugin.getTaskName()); - assertEquals(0, slayerPlugin.getAmount()); + assertEquals("", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); } @Test public void testCancelled() { - slayerPlugin.setTaskName("cows"); - slayerPlugin.setAmount(42); + slayerPlugin.getCurrentTask().setTaskName("cows"); + slayerPlugin.getCurrentTask().setAmount(42); ChatMessage chatMessageEvent = new ChatMessage(null, SERVER, "Perterter", TASK_CANCELED, null, 0); slayerPlugin.onChatMessage(chatMessageEvent); - assertEquals("", slayerPlugin.getTaskName()); - assertEquals(0, slayerPlugin.getAmount()); + assertEquals("", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); } @Test @@ -409,13 +409,13 @@ public class SlayerPluginTest { ChatMessage chatMessageEvent = new ChatMessage(null, SERVER, "", BRACLET_SLAUGHTER, null, 0); - slayerPlugin.setAmount(42); + slayerPlugin.getCurrentTask().setAmount(42); slayerPlugin.setSlaughterChargeCount(10); slayerPlugin.onChatMessage(chatMessageEvent); assertEquals(9, slayerPlugin.getSlaughterChargeCount()); - assertEquals(43, slayerPlugin.getAmount()); + assertEquals(43, slayerPlugin.getCurrentTask().getAmount()); chatMessageEvent = new ChatMessage(null, SERVER, "", CHAT_BRACELET_SLAUGHTER_CHARGE, null, 0); slayerPlugin.onChatMessage(chatMessageEvent); @@ -443,13 +443,13 @@ public class SlayerPluginTest chatMessageEvent = new ChatMessage(null, SERVER, "", BRACLET_SLAUGHTER_V2, null, 0); - slayerPlugin.setAmount(42); + slayerPlugin.getCurrentTask().setAmount(42); slayerPlugin.setSlaughterChargeCount(2); slayerPlugin.onChatMessage(chatMessageEvent); assertEquals(1, slayerPlugin.getSlaughterChargeCount()); - assertEquals(43, slayerPlugin.getAmount()); + assertEquals(43, slayerPlugin.getCurrentTask().getAmount()); } @Test @@ -457,12 +457,12 @@ public class SlayerPluginTest { ChatMessage chatMessageEvent = new ChatMessage(null, SERVER, "", BRACLET_EXPEDITIOUS, null, 0); - slayerPlugin.setAmount(42); + slayerPlugin.getCurrentTask().setAmount(42); slayerPlugin.setExpeditiousChargeCount(10); slayerPlugin.onChatMessage(chatMessageEvent); - assertEquals(41, slayerPlugin.getAmount()); + assertEquals(41, slayerPlugin.getCurrentTask().getAmount()); assertEquals(9, slayerPlugin.getExpeditiousChargeCount()); chatMessageEvent = new ChatMessage(null, SERVER, "", CHAT_BRACELET_EXPEDITIOUS_CHARGE, null, 0); @@ -491,12 +491,12 @@ public class SlayerPluginTest chatMessageEvent = new ChatMessage(null, SERVER, "", BRACLET_EXPEDITIOUS_V2, null, 0); - slayerPlugin.setAmount(42); + slayerPlugin.getCurrentTask().setAmount(42); slayerPlugin.setExpeditiousChargeCount(2); slayerPlugin.onChatMessage(chatMessageEvent); - assertEquals(41, slayerPlugin.getAmount()); + assertEquals(41, slayerPlugin.getCurrentTask().getAmount()); assertEquals(1, slayerPlugin.getExpeditiousChargeCount()); } @@ -507,15 +507,15 @@ public class SlayerPluginTest when(player.getLocalLocation()).thenReturn(new LocalPoint(0, 0)); when(client.getLocalPlayer()).thenReturn(player); - slayerPlugin.setTaskName("Suqahs"); - slayerPlugin.setAmount(231); + slayerPlugin.getCurrentTask().setTaskName("Suqahs"); + slayerPlugin.getCurrentTask().setAmount(231); ChatMessage chatMessage = new ChatMessage(null, SERVER, "", TASK_UPDATE_COMBAT_BRACELET, null, 0); slayerPlugin.onChatMessage(chatMessage); - assertEquals("Suqahs", slayerPlugin.getTaskName()); + assertEquals("Suqahs", slayerPlugin.getCurrentTask().getTaskName()); slayerPlugin.killedOne(); - assertEquals(30, slayerPlugin.getAmount()); + assertEquals(30, slayerPlugin.getCurrentTask().getAmount()); } @Test