Raids: Enable screenshotting of scouting overlay

This commit is contained in:
Alexsuperfly
2019-11-26 20:44:36 -05:00
committed by Adam
parent bbdf76a0b6
commit ecbfd9caa9
4 changed files with 97 additions and 4 deletions

View File

@@ -27,6 +27,8 @@ package net.runelite.client.plugins.raids;
import net.runelite.client.config.Config; import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem; import net.runelite.client.config.ConfigItem;
import net.runelite.client.config.Keybind;
import net.runelite.client.util.ImageUploadStyle;
@ConfigGroup("raids") @ConfigGroup("raids")
public interface RaidsConfig extends Config public interface RaidsConfig extends Config
@@ -175,7 +177,7 @@ public interface RaidsConfig extends Config
} }
@ConfigItem( @ConfigItem(
position = 12, position = 13,
keyName = "showLootValue", keyName = "showLootValue",
name = "Show Loot Value", name = "Show Loot Value",
description = "Shows the value of your loot at the end of a raid" description = "Shows the value of your loot at the end of a raid"
@@ -184,4 +186,26 @@ public interface RaidsConfig extends Config
{ {
return true; return true;
} }
@ConfigItem(
position = 14,
keyName = "screenshotHotkey",
name = "Scouter screenshot hotkey",
description = "Hotkey used to screenshot the scouting overlay"
)
default Keybind screenshotHotkey()
{
return Keybind.NOT_SET;
}
@ConfigItem(
position = 15,
keyName = "uploadScreenshot",
name = "Upload scouting screenshot",
description = "Uploads the scouting screenshot to Imgur or the clipboard"
)
default ImageUploadStyle uploadScreenshot()
{
return ImageUploadStyle.CLIPBOARD;
}
} }

View File

@@ -29,6 +29,7 @@ import java.awt.Dimension;
import java.awt.FontMetrics; import java.awt.FontMetrics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import javax.inject.Inject; import javax.inject.Inject;
import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import net.runelite.api.ClanMemberManager; import net.runelite.api.ClanMemberManager;
import net.runelite.api.Client; import net.runelite.api.Client;
@@ -49,12 +50,14 @@ public class RaidsOverlay extends Overlay
{ {
private static final int OLM_PLANE = 0; private static final int OLM_PLANE = 0;
static final String BROADCAST_ACTION = "Broadcast layout"; static final String BROADCAST_ACTION = "Broadcast layout";
static final String SCREENSHOT_ACTION = "Screenshot";
private Client client; private Client client;
private RaidsPlugin plugin; private RaidsPlugin plugin;
private RaidsConfig config; private RaidsConfig config;
private final PanelComponent panelComponent = new PanelComponent(); private final PanelComponent panelComponent = new PanelComponent();
@Getter
@Setter @Setter
private boolean scoutOverlayShown = false; private boolean scoutOverlayShown = false;
@@ -69,6 +72,7 @@ public class RaidsOverlay extends Overlay
this.config = config; this.config = config;
getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Raids overlay")); getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Raids overlay"));
getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY, BROADCAST_ACTION, "Raids overlay")); getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY, BROADCAST_ACTION, "Raids overlay"));
getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY, SCREENSHOT_ACTION, "Raids overlay"));
} }
@Override @Override

View File

@@ -28,6 +28,10 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
import com.google.inject.Binder; import com.google.inject.Binder;
import com.google.inject.Provides; import com.google.inject.Provides;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException; import java.io.IOException;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.time.Instant; import java.time.Instant;
@@ -69,12 +73,14 @@ import net.runelite.client.chat.ChatMessageBuilder;
import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.chat.QueuedMessage; import net.runelite.client.chat.QueuedMessage;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.ChatInput; import net.runelite.client.events.ChatInput;
import net.runelite.client.events.ConfigChanged; import net.runelite.client.events.ConfigChanged;
import net.runelite.client.events.OverlayMenuClicked; import net.runelite.client.events.OverlayMenuClicked;
import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemManager;
import net.runelite.client.game.SpriteManager; import net.runelite.client.game.SpriteManager;
import net.runelite.client.input.KeyManager;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.raids.solver.Layout; import net.runelite.client.plugins.raids.solver.Layout;
@@ -82,6 +88,8 @@ import net.runelite.client.plugins.raids.solver.LayoutSolver;
import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.OverlayManager;
import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.ui.overlay.infobox.InfoBoxManager;
import net.runelite.client.util.QuantityFormatter; import net.runelite.client.util.QuantityFormatter;
import net.runelite.client.util.HotkeyListener;
import net.runelite.client.util.ImageCapture;
import net.runelite.client.util.Text; import net.runelite.client.util.Text;
import static net.runelite.client.util.Text.sanitize; import static net.runelite.client.util.Text.sanitize;
import net.runelite.client.ws.PartyMember; import net.runelite.client.ws.PartyMember;
@@ -108,6 +116,9 @@ public class RaidsPlugin extends Plugin
private static final String LAYOUT_COMMAND = "!layout"; private static final String LAYOUT_COMMAND = "!layout";
private static final int MAX_LAYOUT_LEN = 300; private static final int MAX_LAYOUT_LEN = 300;
@Inject
private RuneLiteConfig runeLiteConfig;
@Inject @Inject
private ChatMessageManager chatMessageManager; private ChatMessageManager chatMessageManager;
@@ -153,6 +164,12 @@ public class RaidsPlugin extends Plugin
@Inject @Inject
private ItemManager itemManager; private ItemManager itemManager;
@Inject
private KeyManager keyManager;
@Inject
private ImageCapture imageCapture;
@Getter @Getter
private final Set<String> roomWhitelist = new HashSet<String>(); private final Set<String> roomWhitelist = new HashSet<String>();
@@ -195,6 +212,7 @@ public class RaidsPlugin extends Plugin
updateLists(); updateLists();
clientThread.invokeLater(() -> checkRaidPresence(true)); clientThread.invokeLater(() -> checkRaidPresence(true));
chatCommandManager.registerCommandAsync(LAYOUT_COMMAND, this::lookupRaid, this::submitRaid); chatCommandManager.registerCommandAsync(LAYOUT_COMMAND, this::lookupRaid, this::submitRaid);
keyManager.registerKeyListener(screenshotHotkeyListener);
} }
@Override @Override
@@ -207,6 +225,7 @@ public class RaidsPlugin extends Plugin
raid = null; raid = null;
timer = null; timer = null;
chestOpened = false; chestOpened = false;
keyManager.unregisterKeyListener(screenshotHotkeyListener);
} }
@Subscribe @Subscribe
@@ -334,12 +353,20 @@ public class RaidsPlugin extends Plugin
@Subscribe @Subscribe
public void onOverlayMenuClicked(final OverlayMenuClicked event) public void onOverlayMenuClicked(final OverlayMenuClicked event)
{ {
if (event.getEntry().getMenuAction() == MenuAction.RUNELITE_OVERLAY && if (!(event.getEntry().getMenuAction() == MenuAction.RUNELITE_OVERLAY
event.getEntry().getOption().equals(RaidsOverlay.BROADCAST_ACTION) && && event.getOverlay() == overlay))
event.getOverlay() == overlay) {
return;
}
if (event.getEntry().getOption().equals(RaidsOverlay.BROADCAST_ACTION))
{ {
sendRaidLayoutMessage(); sendRaidLayoutMessage();
} }
else if (event.getEntry().getOption().equals(RaidsOverlay.SCREENSHOT_ACTION))
{
screenshotScoutOverlay();
}
} }
private void checkRaidPresence(boolean force) private void checkRaidPresence(boolean force)
@@ -752,4 +779,32 @@ public class RaidsPlugin extends Plugin
return true; return true;
} }
private final HotkeyListener screenshotHotkeyListener = new HotkeyListener(() -> config.screenshotHotkey())
{
@Override
public void hotkeyPressed()
{
screenshotScoutOverlay();
}
};
private void screenshotScoutOverlay()
{
if (!overlay.isScoutOverlayShown())
{
return;
}
Rectangle overlayDimensions = overlay.getBounds();
BufferedImage overlayImage = new BufferedImage(overlayDimensions.width, overlayDimensions.height, BufferedImage.TYPE_INT_ARGB);
Graphics2D graphic = overlayImage.createGraphics();
graphic.setFont(runeLiteConfig.interfaceFontType().getFont());
graphic.setColor(Color.BLACK);
graphic.fillRect(0, 0, overlayDimensions.width, overlayDimensions.height);
overlay.render(graphic);
imageCapture.takeScreenshot(overlayImage, "CoX_scout-", false, config.uploadScreenshot());
graphic.dispose();
}
} }

View File

@@ -44,6 +44,8 @@ import net.runelite.client.game.ItemManager;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import net.runelite.client.Notifier;
import net.runelite.client.util.ImageCapture;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -81,6 +83,14 @@ public class RaidsPluginTest
@Bind @Bind
ChatMessageManager chatMessageManager; ChatMessageManager chatMessageManager;
@Mock
@Bind
ImageCapture imageCapture;
@Mock
@Bind
Notifier notifier;
@Mock @Mock
@Bind @Bind
RaidsConfig raidsConfig; RaidsConfig raidsConfig;