clue plugin: move widget highlights to plugin

Co-authored-by: Hydrox6 <ikada@protonmail.ch>
This commit is contained in:
Adam
2019-04-13 10:33:26 -04:00
parent dd766b8700
commit 90f2b1ad9e
2 changed files with 67 additions and 60 deletions

View File

@@ -24,13 +24,8 @@
*/ */
package net.runelite.client.plugins.cluescrolls; package net.runelite.client.plugins.cluescrolls;
import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.geom.Area;
import javax.inject.Inject; import javax.inject.Inject;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
@@ -40,21 +35,14 @@ import net.runelite.client.plugins.cluescrolls.clues.EmoteClue;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.OverlayUtil;
import net.runelite.client.ui.overlay.components.TextComponent;
public class ClueScrollEmoteOverlay extends Overlay class ClueScrollEmoteOverlay extends Overlay
{ {
private static final Color HIGHLIGHT_BORDER_COLOR = Color.ORANGE;
private static final Color HIGHLIGHT_HOVER_BORDER_COLOR = HIGHLIGHT_BORDER_COLOR.darker();
private static final Color HIGHLIGHT_FILL_COLOR = new Color(0, 255, 0, 20);
private final ClueScrollPlugin plugin; private final ClueScrollPlugin plugin;
private final Client client; private final Client client;
private final TextComponent textComponent = new TextComponent();
@Inject @Inject
public ClueScrollEmoteOverlay(ClueScrollPlugin plugin, Client client) private ClueScrollEmoteOverlay(ClueScrollPlugin plugin, Client client)
{ {
setPosition(OverlayPosition.DYNAMIC); setPosition(OverlayPosition.DYNAMIC);
setLayer(OverlayLayer.ABOVE_WIDGETS); setLayer(OverlayLayer.ABOVE_WIDGETS);
@@ -67,7 +55,7 @@ public class ClueScrollEmoteOverlay extends Overlay
{ {
ClueScroll clue = plugin.getClue(); ClueScroll clue = plugin.getClue();
if (clue == null || !(clue instanceof EmoteClue)) if (!(clue instanceof EmoteClue))
{ {
return null; return null;
} }
@@ -97,56 +85,16 @@ public class ClueScrollEmoteOverlay extends Overlay
{ {
if (emoteWidget.getSpriteId() == emoteClue.getFirstEmote().getSpriteId()) if (emoteWidget.getSpriteId() == emoteClue.getFirstEmote().getSpriteId())
{ {
highlightWidget(graphics, emoteWindow, emoteWidget, plugin.highlightWidget(graphics, emoteWidget, emoteWindow, null,
emoteClue.getSecondEmote() != null ? "1st" : ""); emoteClue.getSecondEmote() != null ? "1st" : null);
} }
else if (emoteClue.getSecondEmote() != null else if (emoteClue.getSecondEmote() != null
&& emoteWidget.getSpriteId() == emoteClue.getSecondEmote().getSpriteId()) && emoteWidget.getSpriteId() == emoteClue.getSecondEmote().getSpriteId())
{ {
highlightWidget(graphics, emoteWindow, emoteWidget, "2nd"); plugin.highlightWidget(graphics, emoteWidget, emoteWindow, null, "2nd");
} }
} }
return null; return null;
} }
private void highlightWidget(Graphics2D graphics, Widget window, Widget widget, String text)
{
net.runelite.api.Point canvasLocation = widget.getCanvasLocation();
if (canvasLocation == null)
{
return;
}
// Don't draw outside the emotes window
net.runelite.api.Point windowLocation = window.getCanvasLocation();
if (windowLocation.getY() > canvasLocation.getY() + widget.getHeight()
|| windowLocation.getY() + window.getHeight() < canvasLocation.getY())
{
return;
}
// Visible area of emote widget
Area widgetArea = new Area(
new Rectangle(
canvasLocation.getX(),
Math.max(canvasLocation.getY(), windowLocation.getY()),
widget.getWidth(),
Math.min(
Math.min(windowLocation.getY() + window.getHeight() - canvasLocation.getY(), widget.getHeight()),
Math.min(canvasLocation.getY() + widget.getHeight() - windowLocation.getY(), widget.getHeight()))));
OverlayUtil.renderHoverableArea(graphics, widgetArea, client.getMouseCanvasPosition(),
HIGHLIGHT_FILL_COLOR, HIGHLIGHT_BORDER_COLOR, HIGHLIGHT_HOVER_BORDER_COLOR);
FontMetrics fontMetrics = graphics.getFontMetrics();
textComponent.setPosition(new Point(
canvasLocation.getX() + widget.getWidth() / 2 - fontMetrics.stringWidth(text) / 2,
canvasLocation.getY() + fontMetrics.getHeight()));
textComponent.setText(text);
textComponent.render(graphics);
}
} }

View File

@@ -26,10 +26,15 @@
*/ */
package net.runelite.client.plugins.cluescrolls; package net.runelite.client.plugins.cluescrolls;
import com.google.common.base.MoreObjects;
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.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Area;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.time.Duration;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -48,6 +53,7 @@ import net.runelite.api.ItemComposition;
import net.runelite.api.ItemID; import net.runelite.api.ItemID;
import net.runelite.api.NPC; import net.runelite.api.NPC;
import net.runelite.api.ObjectComposition; import net.runelite.api.ObjectComposition;
import net.runelite.api.Point;
import net.runelite.api.Scene; import net.runelite.api.Scene;
import net.runelite.api.Tile; import net.runelite.api.Tile;
import net.runelite.api.TileObject; import net.runelite.api.TileObject;
@@ -84,6 +90,8 @@ import net.runelite.client.plugins.cluescrolls.clues.ObjectClueScroll;
import net.runelite.client.plugins.cluescrolls.clues.TextClueScroll; import net.runelite.client.plugins.cluescrolls.clues.TextClueScroll;
import net.runelite.client.plugins.cluescrolls.clues.ThreeStepCrypticClue; import net.runelite.client.plugins.cluescrolls.clues.ThreeStepCrypticClue;
import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.OverlayManager;
import net.runelite.client.ui.overlay.OverlayUtil;
import net.runelite.client.ui.overlay.components.TextComponent;
import net.runelite.client.ui.overlay.worldmap.WorldMapPointManager; import net.runelite.client.ui.overlay.worldmap.WorldMapPointManager;
import net.runelite.client.util.ImageUtil; import net.runelite.client.util.ImageUtil;
import net.runelite.client.util.Text; import net.runelite.client.util.Text;
@@ -96,7 +104,9 @@ import net.runelite.client.util.Text;
@Slf4j @Slf4j
public class ClueScrollPlugin extends Plugin public class ClueScrollPlugin extends Plugin
{ {
private static final Duration WAIT_DURATION = Duration.ofMinutes(4); private static final Color HIGHLIGHT_BORDER_COLOR = Color.ORANGE;
private static final Color HIGHLIGHT_HOVER_BORDER_COLOR = HIGHLIGHT_BORDER_COLOR.darker();
private static final Color HIGHLIGHT_FILL_COLOR = new Color(0, 255, 0, 20);
@Getter @Getter
private ClueScroll clue; private ClueScroll clue;
@@ -143,6 +153,8 @@ public class ClueScrollPlugin extends Plugin
private Integer clueItemId; private Integer clueItemId;
private boolean worldMapPointsSet = false; private boolean worldMapPointsSet = false;
private final TextComponent textComponent = new TextComponent();
@Provides @Provides
ClueScrollConfig getConfig(ConfigManager configManager) ClueScrollConfig getConfig(ConfigManager configManager)
{ {
@@ -668,4 +680,51 @@ public class ClueScrollPlugin extends Plugin
checkClueNPCs(clue, client.getCachedNPCs()); checkClueNPCs(clue, client.getCachedNPCs());
this.clue = clue; this.clue = clue;
} }
void highlightWidget(Graphics2D graphics, Widget toHighlight, Widget container, Rectangle padding, String text)
{
padding = MoreObjects.firstNonNull(padding, new Rectangle());
Point canvasLocation = toHighlight.getCanvasLocation();
if (canvasLocation == null)
{
return;
}
Point windowLocation = container.getCanvasLocation();
if (windowLocation.getY() > canvasLocation.getY() + toHighlight.getHeight()
|| windowLocation.getY() + container.getHeight() < canvasLocation.getY())
{
return;
}
// Visible area of widget
Area widgetArea = new Area(
new Rectangle(
canvasLocation.getX() - padding.x,
Math.max(canvasLocation.getY(), windowLocation.getY()) - padding.y,
toHighlight.getWidth() + padding.x + padding.width,
Math.min(
Math.min(windowLocation.getY() + container.getHeight() - canvasLocation.getY(), toHighlight.getHeight()),
Math.min(canvasLocation.getY() + toHighlight.getHeight() - windowLocation.getY(), toHighlight.getHeight())) + padding.y + padding.height
));
OverlayUtil.renderHoverableArea(graphics, widgetArea, client.getMouseCanvasPosition(),
HIGHLIGHT_FILL_COLOR, HIGHLIGHT_BORDER_COLOR, HIGHLIGHT_HOVER_BORDER_COLOR);
if (text == null)
{
return;
}
FontMetrics fontMetrics = graphics.getFontMetrics();
textComponent.setPosition(new java.awt.Point(
canvasLocation.getX() + toHighlight.getWidth() / 2 - fontMetrics.stringWidth(text) / 2,
canvasLocation.getY() + fontMetrics.getHeight()));
textComponent.setText(text);
textComponent.render(graphics);
}
} }