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 c8cbf34d1f..0c2b3c116d 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 @@ -239,8 +239,6 @@ public class SlayerPlugin extends Plugin .build(); clientToolbar.addNavigation(navButton); - System.out.println("================================="); - System.out.println("added slayer nav button"); if (client.getGameState() == GameState.LOGGED_IN && config.amount() != -1 @@ -284,7 +282,7 @@ public class SlayerPlugin extends Plugin case HOPPING: case LOGGING_IN: cachedXp = 0; - currentTask = new TaskData(0, 0,0, 0, "", "", true); + currentTask = new TaskData(0, 0, 0,0, 0, "", "", true); loginFlag = true; highlightedTargets.clear(); break; @@ -560,6 +558,8 @@ public class SlayerPlugin extends Plugin return; } + int delta = slayerExp - cachedXp; + currentTask.setElapsedXp(currentTask.getElapsedXp() + delta); killedOne(); cachedXp = slayerExp; } @@ -689,6 +689,7 @@ public class SlayerPlugin extends Plugin { currentTask = new TaskData(isNewAssignment ? 0 : currentTask.getElapsedTime(), isNewAssignment ? 0 : currentTask.getElapsedKills(), + isNewAssignment ? 0 : currentTask.getElapsedXp(), amt, initAmt, location, name, isNewAssignment ? true : currentTask.isPaused()); panel.updateCurrentTask(true, currentTask.isPaused(), currentTask, isNewAssignment); 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 48d3fb98da..e016a559c0 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 @@ -22,6 +22,7 @@ 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.ImageUtil; import net.runelite.client.util.StackFormatter; public class SlayerTaskPanel extends PluginPanel @@ -37,6 +38,9 @@ public class SlayerTaskPanel extends PluginPanel "%s%02d:%02d:%02d"; + private static final ImageIcon PAUSE, PAUSE_FADED, PAUSE_HOVER; + private static final ImageIcon PLAY, PLAY_FADED, PLAY_HOVER; + // 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; @@ -62,6 +66,20 @@ public class SlayerTaskPanel extends PluginPanel private SlayerPlugin slayerPlugin; + static + { + final BufferedImage pauseImg = ImageUtil.getResourceStreamFromClass(SlayerPlugin.class, "pause_icon.png"); + final BufferedImage playImg = ImageUtil.getResourceStreamFromClass(SlayerPlugin.class, "play_icon.png"); + + PAUSE = new ImageIcon(pauseImg); + PAUSE_FADED = new ImageIcon(ImageUtil.alphaOffset(pauseImg, -180)); + PAUSE_HOVER = new ImageIcon(ImageUtil.alphaOffset(pauseImg, -220)); + + PLAY = new ImageIcon(playImg); + PLAY_FADED = new ImageIcon(ImageUtil.alphaOffset(playImg, -180)); + PLAY_HOVER = new ImageIcon(ImageUtil.alphaOffset(playImg, -220)); + } + public SlayerTaskPanel(SlayerPlugin slayerPlugin) { this.slayerPlugin = slayerPlugin; @@ -75,34 +93,93 @@ public class SlayerTaskPanel extends PluginPanel layoutPanel.setLayout(new BoxLayout(layoutPanel, BoxLayout.Y_AXIS)); add(layoutPanel, BorderLayout.NORTH); - actionsContainer.setLayout(new GridLayout(1, 2, 10, 0)); + actionsContainer.setLayout(new BorderLayout()); 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("->"); + final JPanel controlsPanel = new JPanel(new GridLayout(1, 2, 10, 0)); + controlsPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); + + playBtn.setIcon(PLAY); playBtn.setToolTipText("Resume the current slayer task"); playBtn.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent mouseEvent) { slayerPlugin.setPaused(false); + changePauseState(false); + } + + @Override + public void mouseExited(MouseEvent mouseEvent) + { + boolean paused = true; + TaskData currentTask = slayerPlugin.getCurrentTask(); + if (currentTask != null) + { + paused = currentTask.isPaused(); + } + playBtn.setIcon(paused ? PLAY_FADED : PLAY); + } + + @Override + public void mouseEntered(MouseEvent mouseEvent) + { + boolean paused = true; + TaskData currentTask = slayerPlugin.getCurrentTask(); + if (currentTask != null) + { + paused = currentTask.isPaused(); + } + playBtn.setIcon(paused ? PLAY_HOVER : PLAY); } }); - pauseBtn.setText("||"); + pauseBtn.setIcon(PAUSE); pauseBtn.setToolTipText("Pause the current slayer task"); pauseBtn.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent mouseEvent) { slayerPlugin.setPaused(true); + changePauseState(true); + } + @Override + public void mouseExited(MouseEvent mouseEvent) + { + boolean paused = true; + TaskData currentTask = slayerPlugin.getCurrentTask(); + if (currentTask != null) + { + paused = currentTask.isPaused(); + } + pauseBtn.setIcon(paused ? PAUSE : PAUSE_FADED); + } + + @Override + public void mouseEntered(MouseEvent mouseEvent) + { + boolean paused = true; + TaskData currentTask = slayerPlugin.getCurrentTask(); + if (currentTask != null) + { + paused = currentTask.isPaused(); + } + pauseBtn.setIcon(paused ? PAUSE : PAUSE_HOVER); } }); - actionsContainer.add(playBtn); - actionsContainer.add(pauseBtn); + controlsPanel.add(playBtn); + controlsPanel.add(pauseBtn); + + actionsContainer.add(controlsPanel, BorderLayout.EAST); + changePauseState(true); + if (slayerPlugin.getCurrentTask() != null) + { + changePauseState(slayerPlugin.getCurrentTask().isPaused()); + } // Create panel that will contain overall data overallPanel.setBorder(new EmptyBorder(8, 10, 8, 10)); @@ -138,6 +215,12 @@ public class SlayerTaskPanel extends PluginPanel overallIcon.setIcon(new ImageIcon(img)); } + private void changePauseState(boolean paused) + { + playBtn.setIcon(paused ? PLAY_FADED : PLAY); + pauseBtn.setIcon(paused ? PAUSE : PAUSE_FADED); + } + private void updateOverall() { int overallKills = 0; @@ -181,7 +264,6 @@ public class SlayerTaskPanel extends PluginPanel { 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()); @@ -190,8 +272,6 @@ public class SlayerTaskPanel extends PluginPanel 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); @@ -204,10 +284,6 @@ public class SlayerTaskPanel extends PluginPanel // 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()) @@ -215,7 +291,6 @@ public class SlayerTaskPanel extends PluginPanel // 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 @@ -229,16 +304,13 @@ public class SlayerTaskPanel extends PluginPanel } } - 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(); + changePauseState(paused); } static String htmlLabel(String key, long timeMillis) 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 index 1cbbfb32ca..96b0978a58 100644 --- 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 @@ -61,6 +61,8 @@ public class TaskBox extends JPanel private final JLabel remainingDuration = new JLabel(); private final JLabel currentKills = new JLabel(); private final JLabel remainingKills = new JLabel(); + private final JLabel currentXp = new JLabel(); + private final JLabel remainingXp = new JLabel(); private boolean paused = false; @@ -84,7 +86,7 @@ public class TaskBox extends JPanel headerPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); headerPanel.setLayout(new BorderLayout()); - statsPanel.setLayout(new DynamicGridLayout(2, 2)); + statsPanel.setLayout(new DynamicGridLayout(3, 2)); statsPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); statsPanel.setBorder(new EmptyBorder(9, 2, 9, 2)); @@ -92,11 +94,15 @@ public class TaskBox extends JPanel remainingDuration.setFont(FontManager.getRunescapeSmallFont()); currentKills.setFont(FontManager.getRunescapeSmallFont()); remainingKills.setFont(FontManager.getRunescapeSmallFont()); + currentXp.setFont(FontManager.getRunescapeSmallFont()); + remainingXp.setFont(FontManager.getRunescapeSmallFont()); statsPanel.add(currentDuration); - statsPanel.add(currentKills); statsPanel.add(remainingDuration); + statsPanel.add(currentKills); statsPanel.add(remainingKills); + statsPanel.add(currentXp); + statsPanel.add(remainingXp); headerPanel.add(taskIcon, BorderLayout.WEST); headerPanel.add(statsPanel, BorderLayout.CENTER); @@ -159,19 +165,25 @@ public class TaskBox extends JPanel { if (getParent() != panel) { - panel.add(this); + panel.add(this, 0); panel.revalidate(); } // Update data taskData.setElapsedKills(newData.getElapsedKills()); taskData.setAmount(newData.getAmount()); + taskData.setElapsedXp(newData.getElapsedXp()); // Update information labels int kills = taskData.getInitialAmount() - taskData.getAmount(); currentKills.setText(htmlLabel("Elapsed Kills: ", taskData.getElapsedKills())); remainingKills.setText(htmlLabel("Remaining Kills: ", taskData.getAmount())); + currentXp.setText(htmlLabel("Elapsed Xp: ", taskData.getElapsedXp())); + double xpPerKill = ((double) taskData.getElapsedXp()) / ((double) taskData.getElapsedKills()); + double xpLeft = xpPerKill * taskData.getAmount(); + remainingXp.setText(htmlLabel("Remaining Xp: ", (int) xpLeft)); + // Update progress bar double percentComplete = ((double) kills) / ((double) taskData.getInitialAmount()); progressBar.setValue((int) (percentComplete * 100)); @@ -225,8 +237,8 @@ public class TaskBox extends JPanel // 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))); + currentDuration.setText(htmlLabel("Elapsed Time:
", taskData.getElapsedTime())); + remainingDuration.setText(htmlLabel("Remaining Time:
", estimateRemainingTime(taskData))); repaint(); } 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 index c76f8cf3c7..17e43d8be3 100644 --- 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 @@ -11,6 +11,7 @@ public class TaskData { private long elapsedTime; private int elapsedKills; + private int elapsedXp; private int amount, initialAmount; private String taskLocation; private String taskName; diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/slayer/pause_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/slayer/pause_icon.png new file mode 100644 index 0000000000..57baef8bd3 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/slayer/pause_icon.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/slayer/play_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/slayer/play_icon.png new file mode 100644 index 0000000000..1a5b02e867 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/slayer/play_icon.png differ