diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index b4c5dda576..c337f64002 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -280,6 +280,7 @@ public class WidgetID { static final int EMOTE_WINDOW = 0; static final int EMOTE_CONTAINER = 1; + static final int EMOTE_SCROLLBAR = 2; } static class Cluescroll @@ -772,6 +773,7 @@ public class WidgetID { static final int CONTAINER = 0; static final int LIST = 3; + static final int SCROLLBAR = 4; } static class Barrows_Puzzle diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index a63b467e53..78bb2832b4 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -75,9 +75,11 @@ public enum WidgetInfo EMOTE_WINDOW(WidgetID.EMOTES_GROUP_ID, WidgetID.Emotes.EMOTE_WINDOW), EMOTE_CONTAINER(WidgetID.EMOTES_GROUP_ID, WidgetID.Emotes.EMOTE_CONTAINER), + EMOTE_SCROLLBAR(WidgetID.EMOTES_GROUP_ID, WidgetID.Emotes.EMOTE_SCROLLBAR), MUSIC_WINDOW(WidgetID.MUSIC_GROUP_ID, WidgetID.Music.CONTAINER), MUSIC_TRACK_LIST(WidgetID.MUSIC_GROUP_ID, WidgetID.Music.LIST), + MUSIC_TRACK_SCROLLBAR(WidgetID.MUSIC_GROUP_ID, WidgetID.Music.SCROLLBAR), DIARY_QUEST_WIDGET_TITLE(WidgetID.DIARY_QUEST_GROUP_ID, WidgetID.Diary.DIARY_TITLE), DIARY_QUEST_WIDGET_TEXT(WidgetID.DIARY_QUEST_GROUP_ID, WidgetID.Diary.DIARY_TEXT), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollEmoteOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollEmoteOverlay.java index 4528b0a7be..ecaa85b8ba 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollEmoteOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollEmoteOverlay.java @@ -41,6 +41,8 @@ class ClueScrollEmoteOverlay extends Overlay private final ClueScrollPlugin plugin; private final Client client; + private boolean hasScrolled; + @Inject private ClueScrollEmoteOverlay(ClueScrollPlugin plugin, Client client) { @@ -57,6 +59,7 @@ class ClueScrollEmoteOverlay extends Overlay if (!(clue instanceof EmoteClue)) { + hasScrolled = false; return null; } @@ -81,19 +84,29 @@ class ClueScrollEmoteOverlay extends Overlay return null; } + Widget firstEmoteWidget = null; + Widget secondEmoteWidget = null; + for (Widget emoteWidget : emoteContainer.getDynamicChildren()) { if (emoteWidget.getSpriteId() == emoteClue.getFirstEmote().getSpriteId()) { + firstEmoteWidget = emoteWidget; plugin.highlightWidget(graphics, emoteWidget, emoteWindow, null, emoteClue.getSecondEmote() != null ? "1st" : null); } else if (emoteClue.getSecondEmote() != null && emoteWidget.getSpriteId() == emoteClue.getSecondEmote().getSpriteId()) { + secondEmoteWidget = emoteWidget; plugin.highlightWidget(graphics, emoteWidget, emoteWindow, null, "2nd"); } } + if (!hasScrolled) + { + hasScrolled = true; + plugin.scrollToWidget(WidgetInfo.EMOTE_CONTAINER, WidgetInfo.EMOTE_SCROLLBAR, firstEmoteWidget, secondEmoteWidget); + } return null; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollMusicOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollMusicOverlay.java index f220399f72..2b44290fb5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollMusicOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollMusicOverlay.java @@ -44,6 +44,8 @@ class ClueScrollMusicOverlay extends Overlay private final ClueScrollPlugin plugin; private final Client client; + private boolean hasScrolled; + @Inject private ClueScrollMusicOverlay(ClueScrollPlugin plugin, Client client) { @@ -60,6 +62,7 @@ class ClueScrollMusicOverlay extends Overlay if (!(clue instanceof MusicClue)) { + hasScrolled = false; return null; } @@ -95,6 +98,11 @@ class ClueScrollMusicOverlay extends Overlay return null; } + if (!hasScrolled) + { + hasScrolled = true; + plugin.scrollToWidget(WidgetInfo.MUSIC_TRACK_LIST, WidgetInfo.MUSIC_TRACK_SCROLLBAR, found); + } plugin.highlightWidget(graphics, found, trackList, PADDING, null); return null; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java index 4cd33c3b06..fafb40872f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java @@ -55,6 +55,7 @@ import net.runelite.api.NPC; import net.runelite.api.ObjectComposition; import net.runelite.api.Point; import net.runelite.api.Scene; +import net.runelite.api.ScriptID; import net.runelite.api.Tile; import net.runelite.api.TileObject; import net.runelite.api.coords.LocalPoint; @@ -739,4 +740,33 @@ public class ClueScrollPlugin extends Plugin textComponent.setText(text); textComponent.render(graphics); } + + void scrollToWidget(WidgetInfo list, WidgetInfo scrollbar, Widget ... toHighlight) + { + final Widget parent = client.getWidget(list); + int averageCentralY = 0; + int nonnullCount = 0; + for (Widget widget : toHighlight) + { + if (widget != null) + { + averageCentralY += widget.getRelativeY() + widget.getHeight() / 2; + nonnullCount += 1; + } + } + if (nonnullCount == 0) + { + return; + } + averageCentralY /= nonnullCount; + final int newScroll = Math.max(0, Math.min(parent.getScrollHeight(), + averageCentralY - parent.getHeight() / 2)); + + client.runScript( + ScriptID.UPDATE_SCROLLBAR, + scrollbar.getId(), + list.getId(), + newScroll + ); + } }