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)); }