From 69729c710c0587917fec5f4f04aa33d53ea6d6ab Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 14 Jul 2018 15:50:14 -0400 Subject: [PATCH] screenshot plugin: move level up and quest screenshots to after widget load Move screenshot to the next game tick after loading the interface. This is needed to fix Hunter as it applies the widget text after it has unhidden the widgets. Co-authored-by: Magic fTail --- .../plugins/screenshot/ScreenshotPlugin.java | 141 +++++++++--------- .../screenshot/ScreenshotPluginTest.java | 43 ++++-- 2 files changed, 100 insertions(+), 84 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index 53146ec599..2ee51069e4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -43,6 +43,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.text.DateFormat; import java.text.SimpleDateFormat; +import net.runelite.api.events.GameTick; import java.time.LocalDate; import java.util.Date; import java.util.concurrent.ScheduledExecutorService; @@ -57,18 +58,16 @@ import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.Point; import net.runelite.api.events.ChatMessage; -import net.runelite.api.events.WidgetHiddenChanged; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; -import net.runelite.api.widgets.WidgetID; import static net.runelite.api.widgets.WidgetID.BARROWS_REWARD_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.RAIDS_REWARD_GROUP_ID; import static net.runelite.api.widgets.WidgetID.CLUE_SCROLL_REWARD_GROUP_ID; import static net.runelite.api.widgets.WidgetID.DIALOG_SPRITE_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.KINGDOM_GROUP_ID; import static net.runelite.api.widgets.WidgetID.LEVEL_UP_GROUP_ID; import static net.runelite.api.widgets.WidgetID.QUEST_COMPLETED_GROUP_ID; -import static net.runelite.api.widgets.WidgetID.RAIDS_REWARD_GROUP_ID; import net.runelite.api.widgets.WidgetInfo; -import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; import net.runelite.client.Notifier; import static net.runelite.client.RuneLite.SCREENSHOT_DIR; import net.runelite.client.config.ConfigManager; @@ -134,6 +133,8 @@ public class ScreenshotPlugin extends Plugin private Integer raidsNumber; + private boolean shouldTakeScreenshot; + @Inject private ScreenshotConfig config; @@ -233,6 +234,38 @@ public class ScreenshotPlugin extends Plugin keyManager.unregisterKeyListener(hotkeyListener); } + @Subscribe + public void onGameTick(GameTick event) + { + if (!shouldTakeScreenshot) + { + return; + } + + shouldTakeScreenshot = false; + + String fileName = null; + if (client.getWidget(WidgetInfo.LEVEL_UP_LEVEL) != null) + { + fileName = parseLevelUpWidget(WidgetInfo.LEVEL_UP_LEVEL); + } + else if (client.getWidget(WidgetInfo.DIALOG_SPRITE_TEXT) != null) + { + fileName = parseLevelUpWidget(WidgetInfo.DIALOG_SPRITE_TEXT); + } + else if (client.getWidget(WidgetInfo.QUEST_COMPLETED_NAME_TEXT) != null) + { + // "You have completed The Corsair Curse!" + String text = client.getWidget(WidgetInfo.QUEST_COMPLETED_NAME_TEXT).getText(); + fileName = text.substring(19, text.length() - 1); + } + + if (fileName != null) + { + takeScreenshot(fileName); + } + } + @Subscribe public void onChatMessage(ChatMessage event) { @@ -290,29 +323,20 @@ public class ScreenshotPlugin extends Plugin @Subscribe public void loadWidgets(WidgetLoaded event) { - if (!config.screenshotKingdom()) - { - return; - } - if (event.getGroupId() == WidgetID.KINGDOM_GROUP_ID) - { - String fileName = "Kingdom " + LocalDate.now(); - takeScreenshot(fileName); - } - } + String fileName; + int groupId = event.getGroupId(); - @Subscribe - public void hideWidgets(WidgetHiddenChanged event) - { - Widget widget = event.getWidget(); - - if (widget.isHidden()) - { - return; - } - - switch (TO_GROUP(widget.getId())) + switch (groupId) { + case QUEST_COMPLETED_GROUP_ID: + case CLUE_SCROLL_REWARD_GROUP_ID: + case RAIDS_REWARD_GROUP_ID: + case BARROWS_REWARD_GROUP_ID: + if (!config.screenshotRewards()) + { + return; + } + break; case LEVEL_UP_GROUP_ID: case DIALOG_SPRITE_GROUP_ID: if (!config.screenshotLevels()) @@ -320,56 +344,31 @@ public class ScreenshotPlugin extends Plugin return; } break; - case QUEST_COMPLETED_GROUP_ID: - case CLUE_SCROLL_REWARD_GROUP_ID: - case BARROWS_REWARD_GROUP_ID: - case RAIDS_REWARD_GROUP_ID: - if (!config.screenshotRewards()) + case KINGDOM_GROUP_ID: + if (!config.screenshotKingdom()) { return; } break; } - String fileName; - - switch (TO_GROUP(widget.getId())) + switch (groupId) { - case LEVEL_UP_GROUP_ID: + case KINGDOM_GROUP_ID: { - fileName = parseLevelUpWidget(WidgetInfo.LEVEL_UP_LEVEL); + fileName = "Kingdom " + LocalDate.now(); + takeScreenshot(fileName); break; } - case DIALOG_SPRITE_GROUP_ID: + case RAIDS_REWARD_GROUP_ID: { - fileName = parseLevelUpWidget(WidgetInfo.DIALOG_SPRITE_TEXT); - break; - } - case QUEST_COMPLETED_GROUP_ID: - { - Widget textChild = client.getWidget(WidgetInfo.QUEST_COMPLETED_NAME_TEXT); - - if (textChild == null) + if (raidsNumber == null) { return; } - // "You have completed The Corsair Curse!" - String text = textChild.getText(); - - fileName = text.substring(19, text.length() - 1); - break; - } - case CLUE_SCROLL_REWARD_GROUP_ID: - { - if (clueType == null || clueNumber == null) - { - return; - } - - fileName = Character.toUpperCase(clueType.charAt(0)) + clueType.substring(1) + "(" + clueNumber + ")"; - clueType = null; - clueNumber = null; + fileName = "Chambers of Xeric(" + raidsNumber + ")"; + raidsNumber = null; break; } case BARROWS_REWARD_GROUP_ID: @@ -383,26 +382,30 @@ public class ScreenshotPlugin extends Plugin barrowsNumber = null; break; } - case RAIDS_REWARD_GROUP_ID: + case LEVEL_UP_GROUP_ID: + case DIALOG_SPRITE_GROUP_ID: + case QUEST_COMPLETED_GROUP_ID: { - if (raidsNumber == null) + // level up widget gets loaded prior to the text being set, so wait until the next tick + shouldTakeScreenshot = true; + return; + } + case CLUE_SCROLL_REWARD_GROUP_ID: + { + if (clueType == null || clueNumber == null) { return; } - fileName = "Raids(" + raidsNumber + ")"; - raidsNumber = null; + fileName = Character.toUpperCase(clueType.charAt(0)) + clueType.substring(1) + "(" + clueNumber + ")"; + clueType = null; + clueNumber = null; break; } default: return; } - if (fileName == null) - { - return; - } - takeScreenshot(fileName); } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java index 2c7699e9e4..a8ddeda280 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java @@ -33,7 +33,8 @@ import javax.inject.Inject; import static net.runelite.api.ChatMessageType.SERVER; import net.runelite.api.Client; import net.runelite.api.events.ChatMessage; -import net.runelite.api.events.WidgetHiddenChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; import static net.runelite.api.widgets.WidgetID.DIALOG_SPRITE_GROUP_ID; import static net.runelite.api.widgets.WidgetID.LEVEL_UP_GROUP_ID; @@ -60,7 +61,7 @@ public class ScreenshotPluginTest { private static final String CLUE_SCROLL = "You have completed 28 medium Treasure Trails"; private static final String BARROWS_CHEST = "Your Barrows chest count is 310"; - private static final String RAIDS_CHEST = "Your completed Chambers of Xeric count is: 489."; + private static final String RAIDS_CHEST = "Your completed Chambers of Xeric count is: 489."; @Mock @Bind @@ -121,7 +122,7 @@ public class ScreenshotPluginTest } @Test - public void testRaidsChest() + public void testChambersOfXericChest() { ChatMessage chatMessageEvent = new ChatMessage(SERVER, "Seth", RAIDS_CHEST, null); screenshotPlugin.onChatMessage(chatMessageEvent); @@ -142,9 +143,12 @@ public class ScreenshotPluginTest assertEquals("Hitpoints(99)", screenshotPlugin.parseLevelUpWidget(LEVEL_UP_LEVEL)); - WidgetHiddenChanged event = new WidgetHiddenChanged(); - event.setWidget(widget); - screenshotPlugin.hideWidgets(event); + WidgetLoaded event = new WidgetLoaded(); + event.setGroupId(LEVEL_UP_GROUP_ID); + screenshotPlugin.loadWidgets(event); + + GameTick tick = new GameTick(); + screenshotPlugin.onGameTick(tick); verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); } @@ -162,9 +166,12 @@ public class ScreenshotPluginTest assertEquals("Firemaking(9)", screenshotPlugin.parseLevelUpWidget(LEVEL_UP_LEVEL)); - WidgetHiddenChanged event = new WidgetHiddenChanged(); - event.setWidget(widget); - screenshotPlugin.hideWidgets(event); + WidgetLoaded event = new WidgetLoaded(); + event.setGroupId(LEVEL_UP_GROUP_ID); + screenshotPlugin.loadWidgets(event); + + GameTick tick = new GameTick(); + screenshotPlugin.onGameTick(tick); verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); } @@ -182,9 +189,12 @@ public class ScreenshotPluginTest assertEquals("Attack(70)", screenshotPlugin.parseLevelUpWidget(LEVEL_UP_LEVEL)); - WidgetHiddenChanged event = new WidgetHiddenChanged(); - event.setWidget(widget); - screenshotPlugin.hideWidgets(event); + WidgetLoaded event = new WidgetLoaded(); + event.setGroupId(LEVEL_UP_GROUP_ID); + screenshotPlugin.loadWidgets(event); + + GameTick tick = new GameTick(); + screenshotPlugin.onGameTick(tick); verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); } @@ -202,9 +212,12 @@ public class ScreenshotPluginTest assertEquals("Hunter(2)", screenshotPlugin.parseLevelUpWidget(DIALOG_SPRITE_TEXT)); - WidgetHiddenChanged event = new WidgetHiddenChanged(); - event.setWidget(widget); - screenshotPlugin.hideWidgets(event); + WidgetLoaded event = new WidgetLoaded(); + event.setGroupId(DIALOG_SPRITE_GROUP_ID); + screenshotPlugin.loadWidgets(event); + + GameTick tick = new GameTick(); + screenshotPlugin.onGameTick(tick); verify(drawManager).requestNextFrameListener(Matchers.any(Consumer.class)); }