From 7a7262d1dcdc53618766dd38f0bdb361bce1a086 Mon Sep 17 00:00:00 2001 From: Davis Cook Date: Tue, 12 Feb 2019 15:05:39 -0500 Subject: [PATCH] Fix ending on 1 kc and new task dialog spanning multiple ticks --- .../client/plugins/slayer/SlayerPlugin.java | 26 ++++++--- .../plugins/slayer/SlayerTaskPanel.java | 5 ++ .../client/plugins/slayer/TaskBox.java | 54 ++++++++++--------- 3 files changed, 55 insertions(+), 30 deletions(-) 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 0c2b3c116d..c8f703cd50 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 @@ -40,6 +40,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.inject.Inject; +import javax.swing.SwingUtilities; import joptsimple.internal.Strings; import lombok.AccessLevel; import lombok.Getter; @@ -75,6 +76,7 @@ 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.game.AsyncBufferedImage; import net.runelite.client.game.ItemManager; import net.runelite.client.game.SpriteManager; import net.runelite.client.plugins.Plugin; @@ -331,11 +333,19 @@ public class SlayerPlugin extends Plugin highlightedTargets.remove(npc); } + // b/c dialog can stay up on screen for multiple ticks in a row we want to make sure we only set a task once + // for the dialog that appears so we need to basically do a rising edge detection that only allows for a dialog + // check to be performed if in the previous ticks there was a period of no dialog + // i.e. once a dialog has been matched dialog cannot be matched again until npc dialog goes away for a tick + // this will work because in order for a new slayer task to happen the player either has to go complete the assignment + // (and close npc dialog) or go into the rewards screen which also closes npc dialog + private boolean canMatchDialog = true; + @Subscribe public void onGameTick(GameTick tick) { Widget npcDialog = client.getWidget(WidgetInfo.DIALOG_NPC_TEXT); - if (npcDialog != null) + if (npcDialog != null && canMatchDialog) { String npcText = Text.sanitizeMultilineText(npcDialog.getText()); //remove color and linebreaks final Matcher mAssign = NPC_ASSIGN_MESSAGE.matcher(npcText); // amount, name, (location) @@ -349,17 +359,20 @@ public class SlayerPlugin extends Plugin int amount = Integer.parseInt(mAssign.group("amount")); String location = mAssign.group("location"); setTask(name, amount, amount, true, location); + canMatchDialog = false; } else if (mAssignFirst.find()) { int amount = Integer.parseInt(mAssignFirst.group(2)); setTask(mAssignFirst.group(1), amount, amount, true); + canMatchDialog = false; } else if (mAssignBoss.find()) { int amount = Integer.parseInt(mAssignBoss.group(2)); setTask(mAssignBoss.group(1), amount, amount, true); points = Integer.parseInt(mAssignBoss.group(3).replaceAll(",", "")); + canMatchDialog = false; } else if (mCurrent.find()) { @@ -367,7 +380,10 @@ public class SlayerPlugin extends Plugin int amount = Integer.parseInt(mCurrent.group("amount")); String location = mCurrent.group("location"); setTask(name, amount, currentTask.getInitialAmount(), false, location); + canMatchDialog = false; } + } else if (npcDialog == null) { + canMatchDialog = true; } Widget braceletBreakWidget = client.getWidget(WidgetInfo.DIALOG_SPRITE_TEXT); @@ -703,16 +719,14 @@ public class SlayerPlugin extends Plugin rebuildTargetList(); } - public BufferedImage getImageForTask(Task task) + public AsyncBufferedImage getImageForTask(Task task) { int itemSpriteId = ItemID.ENCHANTED_GEM; if (task != null) { itemSpriteId = task.getItemSpriteId(); } - - BufferedImage taskImg = itemManager.getImage(itemSpriteId); - return taskImg; + return itemManager.getImage(itemSpriteId); } private void addCounter() @@ -723,7 +737,7 @@ public class SlayerPlugin extends Plugin } Task task = Task.getTask(currentTask.getTaskName()); - BufferedImage taskImg = getImageForTask(task); + AsyncBufferedImage taskImg = getImageForTask(task); String taskTooltip = ColorUtil.wrapWithColorTag("%s", new Color(255, 119, 0)) + "
"; if (currentTask.getTaskLocation() != null && !currentTask.getTaskLocation().isEmpty()) 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 e016a559c0..b3e9937a8a 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 @@ -265,6 +265,11 @@ public class SlayerTaskPanel extends PluginPanel return; } TaskBox current = tasks.get(0); + // current task has ended even though it should still have 1 amount remaining b/c the ending chat message + // pops before the slayer xp drop so we need to force the remaining kc to zero and add the last kc to + // the elapsed kc + current.getTaskData().setAmount(0); + current.getTaskData().setElapsedKills(current.getTaskData().getElapsedKills() + 1); // current task has ended so it should be paused current.update(true, true, current.getTaskData()); return; 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 96b0978a58..79d44b2d53 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 @@ -14,6 +14,7 @@ import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import lombok.AccessLevel; import lombok.Getter; +import net.runelite.client.game.AsyncBufferedImage; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.DynamicGridLayout; import net.runelite.client.ui.FontManager; @@ -77,35 +78,40 @@ public class TaskBox extends JPanel 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)); + SwingUtilities.invokeLater(() -> { + 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(3, 2)); + statsPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); + statsPanel.setBorder(new EmptyBorder(9, 2, 9, 2)); - statsPanel.setLayout(new DynamicGridLayout(3, 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()); + currentXp.setFont(FontManager.getRunescapeSmallFont()); + remainingXp.setFont(FontManager.getRunescapeSmallFont()); + + statsPanel.add(currentDuration); + statsPanel.add(remainingDuration); + statsPanel.add(currentKills); + statsPanel.add(remainingKills); + statsPanel.add(currentXp); + statsPanel.add(remainingXp); + + headerPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); + headerPanel.setLayout(new BorderLayout()); + + headerPanel.add(statsPanel, BorderLayout.CENTER); + headerPanel.add(taskIcon, BorderLayout.WEST); + }); - currentDuration.setFont(FontManager.getRunescapeSmallFont()); - 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(remainingDuration); - statsPanel.add(currentKills); - statsPanel.add(remainingKills); - statsPanel.add(currentXp); - statsPanel.add(remainingXp); - headerPanel.add(taskIcon, BorderLayout.WEST); - headerPanel.add(statsPanel, BorderLayout.CENTER); JPanel progressWrapper = new JPanel(); progressWrapper.setBackground(ColorScheme.DARKER_GRAY_COLOR);