Merge pull request #1571 from Owain94/0909-merge
project: Merge upstream
This commit is contained in:
@@ -446,8 +446,8 @@ public class Hooks implements Callbacks
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
renderer.render(graphics2d, OverlayLayer.ABOVE_WIDGETS);
|
|
||||||
renderer.render(graphics2d, OverlayLayer.ABOVE_MAP);
|
renderer.render(graphics2d, OverlayLayer.ABOVE_MAP);
|
||||||
|
renderer.render(graphics2d, OverlayLayer.ABOVE_WIDGETS);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
*/
|
*/
|
||||||
package net.runelite.client.plugins.chatnotifications;
|
package net.runelite.client.plugins.chatnotifications;
|
||||||
|
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
|
|
||||||
@@ -151,7 +152,7 @@ public class ChatNotificationsPlugin extends Plugin
|
|||||||
List<String> items = Text.fromCSV(this.highlightWordsString);
|
List<String> items = Text.fromCSV(this.highlightWordsString);
|
||||||
String joined = items.stream()
|
String joined = items.stream()
|
||||||
.map(Text::escapeJagex) // we compare these strings to the raw Jagex ones
|
.map(Text::escapeJagex) // we compare these strings to the raw Jagex ones
|
||||||
.map(Pattern::quote)
|
.map(this::quoteAndIgnoreColor) // regex escape and ignore nested colors in the target message
|
||||||
.collect(Collectors.joining("|"));
|
.collect(Collectors.joining("|"));
|
||||||
// To match <word> \b doesn't work due to <> not being in \w,
|
// To match <word> \b doesn't work due to <> not being in \w,
|
||||||
// so match \b or \s
|
// so match \b or \s
|
||||||
@@ -232,7 +233,26 @@ public class ChatNotificationsPlugin extends Plugin
|
|||||||
while (matcher.find())
|
while (matcher.find())
|
||||||
{
|
{
|
||||||
String value = matcher.group();
|
String value = matcher.group();
|
||||||
matcher.appendReplacement(stringBuffer, "<col" + ChatColorType.HIGHLIGHT + ">" + value + "<col" + ChatColorType.NORMAL + ">");
|
|
||||||
|
// Determine the ending color by:
|
||||||
|
// 1) use the color from value if it has one
|
||||||
|
// 2) use the last color from stringBuffer + <content between last match and current match>
|
||||||
|
// To do #2 we just search for the last col tag after calling appendReplacement
|
||||||
|
String endColor = getLastColor(value);
|
||||||
|
|
||||||
|
// Strip color tags from the highlighted region so that it remains highlighted correctly
|
||||||
|
value = stripColor(value);
|
||||||
|
|
||||||
|
matcher.appendReplacement(stringBuffer, "<col" + ChatColorType.HIGHLIGHT + '>' + value);
|
||||||
|
|
||||||
|
if (endColor == null)
|
||||||
|
{
|
||||||
|
endColor = getLastColor(stringBuffer.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append end color
|
||||||
|
stringBuffer.append(endColor == null ? "<col" + ChatColorType.NORMAL + ">" : endColor);
|
||||||
|
|
||||||
update = true;
|
update = true;
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
@@ -292,4 +312,61 @@ public class ChatNotificationsPlugin extends Plugin
|
|||||||
this.notifyOnDuel = config.notifyOnDuel();
|
this.notifyOnDuel = config.notifyOnDuel();
|
||||||
this.notifyOnPm = config.notifyOnPm();
|
this.notifyOnPm = config.notifyOnPm();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String quoteAndIgnoreColor(String str)
|
||||||
|
{
|
||||||
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
|
|
||||||
|
for (int i = 0; i < str.length(); ++i)
|
||||||
|
{
|
||||||
|
char c = str.charAt(i);
|
||||||
|
stringBuilder.append(Pattern.quote(String.valueOf(c)));
|
||||||
|
stringBuilder.append("(?:<col=[^>]*?>)?");
|
||||||
|
}
|
||||||
|
|
||||||
|
return stringBuilder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the last color tag from a string, or null if there was none
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static String getLastColor(String str)
|
||||||
|
{
|
||||||
|
int colIdx = str.lastIndexOf("<col=");
|
||||||
|
int colEndIdx = str.lastIndexOf("</col>");
|
||||||
|
|
||||||
|
if (colEndIdx > colIdx)
|
||||||
|
{
|
||||||
|
// ends in a </col> which resets the color to normal
|
||||||
|
return "<col" + ChatColorType.NORMAL + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (colIdx == -1)
|
||||||
|
{
|
||||||
|
return null; // no color
|
||||||
|
}
|
||||||
|
|
||||||
|
int closeIdx = str.indexOf('>', colIdx);
|
||||||
|
if (closeIdx == -1)
|
||||||
|
{
|
||||||
|
return null; // unclosed col tag
|
||||||
|
}
|
||||||
|
|
||||||
|
return str.substring(colIdx, closeIdx + 1); // include the >
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strip color tags from a string.
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
static String stripColor(String str)
|
||||||
|
{
|
||||||
|
return str.replaceAll("(<col=[0-9a-f]+>|</col>)", "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,6 +115,13 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
private static final Color HIGHLIGHT_BORDER_COLOR = Color.ORANGE;
|
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_HOVER_BORDER_COLOR = HIGHLIGHT_BORDER_COLOR.darker();
|
||||||
private static final Color HIGHLIGHT_FILL_COLOR = new Color(0, 255, 0, 20);
|
private static final Color HIGHLIGHT_FILL_COLOR = new Color(0, 255, 0, 20);
|
||||||
|
private static final int[] REGION_MIRRORS = {
|
||||||
|
// Prifddinas
|
||||||
|
12894, 8755,
|
||||||
|
12895, 8756,
|
||||||
|
13150, 9011,
|
||||||
|
13151, 9012
|
||||||
|
};
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private ClueScroll clue;
|
private ClueScroll clue;
|
||||||
@@ -386,12 +393,13 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
|
|
||||||
if (clue instanceof LocationClueScroll)
|
if (clue instanceof LocationClueScroll)
|
||||||
{
|
{
|
||||||
final WorldPoint location = ((LocationClueScroll) clue).getLocation();
|
final WorldPoint[] locations = ((LocationClueScroll) clue).getLocations();
|
||||||
|
|
||||||
if (location != null)
|
for (WorldPoint location : locations)
|
||||||
{
|
{
|
||||||
// Only set the location hint arrow if we do not already have more accurate location
|
// Only set the location hint arrow if we do not already have more accurate location
|
||||||
if (this.displayHintArrows
|
if (location.isInScene(client)
|
||||||
|
&& this.displayHintArrows
|
||||||
&& (client.getHintArrowNpc() == null
|
&& (client.getHintArrowNpc() == null
|
||||||
|| !npcsToMark.contains(client.getHintArrowNpc())))
|
|| !npcsToMark.contains(client.getHintArrowNpc())))
|
||||||
{
|
{
|
||||||
@@ -618,7 +626,11 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
minX *= -1;
|
minX *= -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new CoordinateClue(text, coordinatesToWorldPoint(degX, minX, degY, minY));
|
WorldPoint coordinate = coordinatesToWorldPoint(degX, minX, degY, minY);
|
||||||
|
// Convert from overworld to real
|
||||||
|
WorldPoint mirrorPoint = getMirrorPoint(coordinate, false);
|
||||||
|
// Use mirror point as mirrorLocation if there is one
|
||||||
|
return new CoordinateClue(text, coordinate, coordinate == mirrorPoint ? null : mirrorPoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -820,4 +832,29 @@ public class ClueScrollPlugin extends Plugin
|
|||||||
newScroll
|
newScroll
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translate a coordinate either between overworld and real, or real and overworld
|
||||||
|
*
|
||||||
|
* @param worldPoint
|
||||||
|
* @param toOverworld whether to convert to overworld coordinates, or to real coordinates
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static WorldPoint getMirrorPoint(WorldPoint worldPoint, boolean toOverworld)
|
||||||
|
{
|
||||||
|
int region = worldPoint.getRegionID();
|
||||||
|
for (int i = 0; i < REGION_MIRRORS.length; i += 2)
|
||||||
|
{
|
||||||
|
int real = REGION_MIRRORS[i];
|
||||||
|
int overworld = REGION_MIRRORS[i + 1];
|
||||||
|
|
||||||
|
// Test against what we are converting from
|
||||||
|
if (region == (toOverworld ? real : overworld))
|
||||||
|
{
|
||||||
|
return WorldPoint.fromRegion(toOverworld ? overworld : real,
|
||||||
|
worldPoint.getRegionX(), worldPoint.getRegionY(), worldPoint.getPlane());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return worldPoint;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ package net.runelite.client.plugins.cluescrolls.clues;
|
|||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import net.runelite.api.coords.LocalPoint;
|
import net.runelite.api.coords.LocalPoint;
|
||||||
import net.runelite.api.coords.WorldPoint;
|
import net.runelite.api.coords.WorldPoint;
|
||||||
@@ -198,14 +199,33 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati
|
|||||||
|
|
||||||
private final String text;
|
private final String text;
|
||||||
private final WorldPoint location;
|
private final WorldPoint location;
|
||||||
|
/**
|
||||||
|
* For regions which are mirrored, the location of the the clue in the mirrored region.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
private final WorldPoint mirrorLocation;
|
||||||
|
|
||||||
public CoordinateClue(String text, WorldPoint location)
|
public CoordinateClue(String text, WorldPoint location, WorldPoint mirrorLocation)
|
||||||
{
|
{
|
||||||
this.text = text;
|
this.text = text;
|
||||||
this.location = location;
|
this.location = location;
|
||||||
|
this.mirrorLocation = mirrorLocation;
|
||||||
setRequiresSpade(true);
|
setRequiresSpade(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WorldPoint[] getLocations()
|
||||||
|
{
|
||||||
|
if (mirrorLocation != null)
|
||||||
|
{
|
||||||
|
return new WorldPoint[]{location, mirrorLocation};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return new WorldPoint[]{location};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin)
|
public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin)
|
||||||
{
|
{
|
||||||
@@ -229,13 +249,14 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati
|
|||||||
@Override
|
@Override
|
||||||
public void makeWorldOverlayHint(Graphics2D graphics, ClueScrollPlugin plugin)
|
public void makeWorldOverlayHint(Graphics2D graphics, ClueScrollPlugin plugin)
|
||||||
{
|
{
|
||||||
LocalPoint localLocation = LocalPoint.fromWorld(plugin.getClient(), getLocation());
|
for (WorldPoint worldPoint : getLocations())
|
||||||
|
|
||||||
if (localLocation == null)
|
|
||||||
{
|
{
|
||||||
return;
|
LocalPoint localLocation = LocalPoint.fromWorld(plugin.getClient(), worldPoint);
|
||||||
}
|
|
||||||
|
|
||||||
OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, plugin.getSpadeImage(), Color.ORANGE);
|
if (localLocation != null)
|
||||||
|
{
|
||||||
|
OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, plugin.getSpadeImage(), Color.ORANGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -292,7 +292,8 @@ public class HotColdClue extends ClueScroll implements LocationClueScroll, Locat
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final WorldPoint localWorld = plugin.getClient().getLocalPlayer().getWorldLocation();
|
// Convert from real to overworld
|
||||||
|
final WorldPoint localWorld = ClueScrollPlugin.getMirrorPoint(plugin.getClient().getLocalPlayer().getWorldLocation(), true);
|
||||||
|
|
||||||
if (localWorld == null)
|
if (localWorld == null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -29,4 +29,10 @@ import net.runelite.api.coords.WorldPoint;
|
|||||||
public interface LocationClueScroll
|
public interface LocationClueScroll
|
||||||
{
|
{
|
||||||
WorldPoint getLocation();
|
WorldPoint getLocation();
|
||||||
|
|
||||||
|
default WorldPoint[] getLocations()
|
||||||
|
{
|
||||||
|
WorldPoint location = getLocation();
|
||||||
|
return location == null ? new WorldPoint[0] : new WorldPoint[]{location};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ import net.runelite.client.ui.FontManager;
|
|||||||
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.OverlayPriority;
|
||||||
import net.runelite.client.ui.overlay.OverlayUtil;
|
import net.runelite.client.ui.overlay.OverlayUtil;
|
||||||
import net.runelite.client.ui.overlay.tooltip.Tooltip;
|
import net.runelite.client.ui.overlay.tooltip.Tooltip;
|
||||||
import net.runelite.client.ui.overlay.tooltip.TooltipManager;
|
import net.runelite.client.ui.overlay.tooltip.TooltipManager;
|
||||||
@@ -106,7 +107,8 @@ class DevToolsOverlay extends Overlay
|
|||||||
private DevToolsOverlay(Client client, DevToolsPlugin plugin, TooltipManager toolTipManager)
|
private DevToolsOverlay(Client client, DevToolsPlugin plugin, TooltipManager toolTipManager)
|
||||||
{
|
{
|
||||||
setPosition(OverlayPosition.DYNAMIC);
|
setPosition(OverlayPosition.DYNAMIC);
|
||||||
setLayer(OverlayLayer.ABOVE_MAP);
|
setLayer(OverlayLayer.ABOVE_WIDGETS);
|
||||||
|
setPriority(OverlayPriority.HIGHEST);
|
||||||
this.client = client;
|
this.client = client;
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
this.toolTipManager = toolTipManager;
|
this.toolTipManager = toolTipManager;
|
||||||
|
|||||||
@@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 Hydrox6 <ikada@protonmail.ch>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package net.runelite.client.plugins.runecraft;
|
||||||
|
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import net.runelite.api.Client;
|
||||||
|
import net.runelite.api.DecorativeObject;
|
||||||
|
import net.runelite.api.Perspective;
|
||||||
|
import net.runelite.api.Point;
|
||||||
|
import net.runelite.client.game.ItemManager;
|
||||||
|
import net.runelite.client.ui.overlay.Overlay;
|
||||||
|
import net.runelite.client.ui.overlay.OverlayLayer;
|
||||||
|
import net.runelite.client.ui.overlay.OverlayPosition;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
class AbyssMinimapOverlay extends Overlay
|
||||||
|
{
|
||||||
|
private static final Dimension IMAGE_SIZE = new Dimension(15, 14);
|
||||||
|
|
||||||
|
private final Map<AbyssRifts, BufferedImage> abyssIcons = new HashMap<>();
|
||||||
|
private final Client client;
|
||||||
|
private final RunecraftPlugin plugin;
|
||||||
|
private final ItemManager itemManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
AbyssMinimapOverlay(Client client, RunecraftPlugin plugin, ItemManager itemManager)
|
||||||
|
{
|
||||||
|
setPosition(OverlayPosition.DYNAMIC);
|
||||||
|
setLayer(OverlayLayer.ABOVE_WIDGETS);
|
||||||
|
this.client = client;
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.itemManager = itemManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dimension render(Graphics2D graphics)
|
||||||
|
{
|
||||||
|
if (!plugin.isShowRifts())
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (DecorativeObject object : plugin.getAbyssObjects())
|
||||||
|
{
|
||||||
|
AbyssRifts rift = AbyssRifts.getRift(object.getId());
|
||||||
|
if (rift == null || !plugin.getRifts().contains(rift))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferedImage image = getImage(rift);
|
||||||
|
Point miniMapImage = Perspective.getMiniMapImageLocation(client, object.getLocalLocation(), image);
|
||||||
|
|
||||||
|
if (miniMapImage != null)
|
||||||
|
{
|
||||||
|
graphics.drawImage(image, miniMapImage.getX(), miniMapImage.getY(), null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BufferedImage getImage(AbyssRifts rift)
|
||||||
|
{
|
||||||
|
BufferedImage image = abyssIcons.get(rift);
|
||||||
|
if (image != null)
|
||||||
|
{
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Since item image is too big, we must resize it first.
|
||||||
|
image = itemManager.getImage(rift.getItemId());
|
||||||
|
BufferedImage resizedImage = new BufferedImage(IMAGE_SIZE.width, IMAGE_SIZE.height, BufferedImage.TYPE_INT_ARGB);
|
||||||
|
Graphics2D g = resizedImage.createGraphics();
|
||||||
|
g.drawImage(image, 0, 0, IMAGE_SIZE.width, IMAGE_SIZE.height, null);
|
||||||
|
g.dispose();
|
||||||
|
|
||||||
|
abyssIcons.put(rift, resizedImage);
|
||||||
|
return resizedImage;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -31,30 +31,10 @@ import java.awt.Dimension;
|
|||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Polygon;
|
import java.awt.Polygon;
|
||||||
import java.awt.geom.Area;
|
import java.awt.geom.Area;
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import net.runelite.api.Client;
|
import net.runelite.api.Client;
|
||||||
import net.runelite.api.DecorativeObject;
|
import net.runelite.api.DecorativeObject;
|
||||||
import net.runelite.api.NPC;
|
import net.runelite.api.NPC;
|
||||||
import net.runelite.api.Perspective;
|
|
||||||
import net.runelite.api.Point;
|
import net.runelite.api.Point;
|
||||||
import net.runelite.client.game.ItemManager;
|
|
||||||
import static net.runelite.client.plugins.runecraft.AbyssRifts.AIR_RIFT;
|
|
||||||
import static net.runelite.client.plugins.runecraft.AbyssRifts.BLOOD_RIFT;
|
|
||||||
import static net.runelite.client.plugins.runecraft.AbyssRifts.BODY_RIFT;
|
|
||||||
import static net.runelite.client.plugins.runecraft.AbyssRifts.CHAOS_RIFT;
|
|
||||||
import static net.runelite.client.plugins.runecraft.AbyssRifts.COSMIC_RIFT;
|
|
||||||
import static net.runelite.client.plugins.runecraft.AbyssRifts.DEATH_RIFT;
|
|
||||||
import static net.runelite.client.plugins.runecraft.AbyssRifts.EARTH_RIFT;
|
|
||||||
import static net.runelite.client.plugins.runecraft.AbyssRifts.FIRE_RIFT;
|
|
||||||
import static net.runelite.client.plugins.runecraft.AbyssRifts.LAW_RIFT;
|
|
||||||
import static net.runelite.client.plugins.runecraft.AbyssRifts.MIND_RIFT;
|
|
||||||
import static net.runelite.client.plugins.runecraft.AbyssRifts.NATURE_RIFT;
|
|
||||||
import static net.runelite.client.plugins.runecraft.AbyssRifts.SOUL_RIFT;
|
|
||||||
import static net.runelite.client.plugins.runecraft.AbyssRifts.WATER_RIFT;
|
|
||||||
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;
|
||||||
@@ -63,17 +43,9 @@ import net.runelite.client.ui.overlay.OverlayUtil;
|
|||||||
@Singleton
|
@Singleton
|
||||||
class AbyssOverlay extends Overlay
|
class AbyssOverlay extends Overlay
|
||||||
{
|
{
|
||||||
private static final Dimension IMAGE_SIZE = new Dimension(15, 14);
|
|
||||||
|
|
||||||
private final Set<AbyssRifts> rifts = new HashSet<>();
|
|
||||||
private final Map<AbyssRifts, BufferedImage> abyssIcons = new HashMap<>();
|
|
||||||
|
|
||||||
private final Client client;
|
private final Client client;
|
||||||
private final RunecraftPlugin plugin;
|
private final RunecraftPlugin plugin;
|
||||||
|
|
||||||
@Inject
|
|
||||||
private ItemManager itemManager;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
AbyssOverlay(final Client client, final RunecraftPlugin plugin)
|
AbyssOverlay(final Client client, final RunecraftPlugin plugin)
|
||||||
{
|
{
|
||||||
@@ -90,7 +62,7 @@ class AbyssOverlay extends Overlay
|
|||||||
{
|
{
|
||||||
for (DecorativeObject object : plugin.getAbyssObjects())
|
for (DecorativeObject object : plugin.getAbyssObjects())
|
||||||
{
|
{
|
||||||
renderRifts(graphics, object);
|
renderRift(graphics, object);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,118 +96,29 @@ class AbyssOverlay extends Overlay
|
|||||||
OverlayUtil.renderPolygon(graphics, tilePoly, Color.green);
|
OverlayUtil.renderPolygon(graphics, tilePoly, Color.green);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void renderRifts(Graphics2D graphics, DecorativeObject object)
|
private void renderRift(Graphics2D graphics, DecorativeObject object)
|
||||||
{
|
{
|
||||||
AbyssRifts rift = AbyssRifts.getRift(object.getId());
|
AbyssRifts rift = AbyssRifts.getRift(object.getId());
|
||||||
if (rift == null || !rifts.contains(rift))
|
if (rift == null || !plugin.getRifts().contains(rift))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (plugin.isShowClickBox())
|
Point mousePosition = client.getMouseCanvasPosition();
|
||||||
|
Area objectClickbox = object.getClickbox();
|
||||||
|
if (objectClickbox != null)
|
||||||
{
|
{
|
||||||
//Draw clickbox
|
if (objectClickbox.contains(mousePosition.getX(), mousePosition.getY()))
|
||||||
Point mousePosition = client.getMouseCanvasPosition();
|
|
||||||
Area objectClickbox = object.getClickbox();
|
|
||||||
if (objectClickbox != null)
|
|
||||||
{
|
{
|
||||||
if (objectClickbox.contains(mousePosition.getX(), mousePosition.getY()))
|
graphics.setColor(Color.MAGENTA.darker());
|
||||||
{
|
|
||||||
graphics.setColor(Color.MAGENTA.darker());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
graphics.setColor(Color.MAGENTA);
|
|
||||||
}
|
|
||||||
graphics.draw(objectClickbox);
|
|
||||||
graphics.setColor(new Color(255, 0, 255, 20));
|
|
||||||
graphics.fill(objectClickbox);
|
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
|
{
|
||||||
//Draw minimap
|
graphics.setColor(Color.MAGENTA);
|
||||||
BufferedImage image = getImage(rift);
|
}
|
||||||
Point miniMapImage = Perspective.getMiniMapImageLocation(client, object.getLocalLocation(), image);
|
graphics.draw(objectClickbox);
|
||||||
|
graphics.setColor(new Color(255, 0, 255, 20));
|
||||||
if (miniMapImage != null)
|
graphics.fill(objectClickbox);
|
||||||
{
|
|
||||||
graphics.drawImage(image, miniMapImage.getX(), miniMapImage.getY(), null);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
private BufferedImage getImage(AbyssRifts rift)
|
|
||||||
{
|
|
||||||
BufferedImage image = abyssIcons.get(rift);
|
|
||||||
if (image != null)
|
|
||||||
{
|
|
||||||
return image;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Since item image is too big, we must resize it first.
|
|
||||||
image = itemManager.getImage(rift.getItemId());
|
|
||||||
BufferedImage resizedImage = new BufferedImage(IMAGE_SIZE.width, IMAGE_SIZE.height, BufferedImage.TYPE_INT_ARGB);
|
|
||||||
Graphics2D g = resizedImage.createGraphics();
|
|
||||||
g.drawImage(image, 0, 0, IMAGE_SIZE.width, IMAGE_SIZE.height, null);
|
|
||||||
g.dispose();
|
|
||||||
|
|
||||||
abyssIcons.put(rift, resizedImage);
|
|
||||||
return resizedImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateConfig()
|
|
||||||
{
|
|
||||||
rifts.clear();
|
|
||||||
if (plugin.isShowAir())
|
|
||||||
{
|
|
||||||
rifts.add(AIR_RIFT);
|
|
||||||
}
|
|
||||||
if (plugin.isShowBlood())
|
|
||||||
{
|
|
||||||
rifts.add(BLOOD_RIFT);
|
|
||||||
}
|
|
||||||
if (plugin.isShowBody())
|
|
||||||
{
|
|
||||||
rifts.add(BODY_RIFT);
|
|
||||||
}
|
|
||||||
if (plugin.isShowChaos())
|
|
||||||
{
|
|
||||||
rifts.add(CHAOS_RIFT);
|
|
||||||
}
|
|
||||||
if (plugin.isShowCosmic())
|
|
||||||
{
|
|
||||||
rifts.add(COSMIC_RIFT);
|
|
||||||
}
|
|
||||||
if (plugin.isShowDeath())
|
|
||||||
{
|
|
||||||
rifts.add(DEATH_RIFT);
|
|
||||||
}
|
|
||||||
if (plugin.isShowEarth())
|
|
||||||
{
|
|
||||||
rifts.add(EARTH_RIFT);
|
|
||||||
}
|
|
||||||
if (plugin.isShowFire())
|
|
||||||
{
|
|
||||||
rifts.add(FIRE_RIFT);
|
|
||||||
}
|
|
||||||
if (plugin.isShowLaw())
|
|
||||||
{
|
|
||||||
rifts.add(LAW_RIFT);
|
|
||||||
}
|
|
||||||
if (plugin.isShowMind())
|
|
||||||
{
|
|
||||||
rifts.add(MIND_RIFT);
|
|
||||||
}
|
|
||||||
if (plugin.isShowNature())
|
|
||||||
{
|
|
||||||
rifts.add(NATURE_RIFT);
|
|
||||||
}
|
|
||||||
if (plugin.isShowSoul())
|
|
||||||
{
|
|
||||||
rifts.add(SOUL_RIFT);
|
|
||||||
}
|
|
||||||
if (plugin.isShowWater())
|
|
||||||
{
|
|
||||||
rifts.add(WATER_RIFT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -61,6 +61,7 @@ import net.runelite.client.plugins.Plugin;
|
|||||||
import net.runelite.client.plugins.PluginDescriptor;
|
import net.runelite.client.plugins.PluginDescriptor;
|
||||||
import net.runelite.client.plugins.menuentryswapper.BankComparableEntry;
|
import net.runelite.client.plugins.menuentryswapper.BankComparableEntry;
|
||||||
import net.runelite.client.plugins.menuentryswapper.EquipmentComparableEntry;
|
import net.runelite.client.plugins.menuentryswapper.EquipmentComparableEntry;
|
||||||
|
import static net.runelite.client.plugins.runecraft.AbyssRifts.*;
|
||||||
import net.runelite.client.ui.overlay.OverlayManager;
|
import net.runelite.client.ui.overlay.OverlayManager;
|
||||||
|
|
||||||
|
|
||||||
@@ -70,7 +71,6 @@ import net.runelite.client.ui.overlay.OverlayManager;
|
|||||||
tags = {"abyssal", "minimap", "overlay", "rifts", "rc", "runecrafting"}
|
tags = {"abyssal", "minimap", "overlay", "rifts", "rc", "runecrafting"}
|
||||||
)
|
)
|
||||||
@Singleton
|
@Singleton
|
||||||
@Getter(AccessLevel.PACKAGE)
|
|
||||||
public class RunecraftPlugin extends Plugin
|
public class RunecraftPlugin extends Plugin
|
||||||
{
|
{
|
||||||
private static final BankComparableEntry POUCH = new BankComparableEntry("fill", "pouch", false);
|
private static final BankComparableEntry POUCH = new BankComparableEntry("fill", "pouch", false);
|
||||||
@@ -88,52 +88,54 @@ public class RunecraftPlugin extends Plugin
|
|||||||
ItemID.LARGE_POUCH_5513,
|
ItemID.LARGE_POUCH_5513,
|
||||||
ItemID.GIANT_POUCH_5515
|
ItemID.GIANT_POUCH_5515
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
|
private final Set<AbyssRifts> rifts = new HashSet<>();
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@Getter(AccessLevel.NONE)
|
|
||||||
private Client client;
|
private Client client;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@Getter(AccessLevel.NONE)
|
|
||||||
private OverlayManager overlayManager;
|
private OverlayManager overlayManager;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@Getter(AccessLevel.NONE)
|
|
||||||
private AbyssOverlay abyssOverlay;
|
private AbyssOverlay abyssOverlay;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private AbyssMinimapOverlay abyssMinimapOverlay;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@Getter(AccessLevel.NONE)
|
|
||||||
private RunecraftOverlay runecraftOverlay;
|
private RunecraftOverlay runecraftOverlay;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@Getter(AccessLevel.NONE)
|
|
||||||
private RunecraftConfig config;
|
private RunecraftConfig config;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@Getter(AccessLevel.NONE)
|
|
||||||
private Notifier notifier;
|
private Notifier notifier;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@Getter(AccessLevel.NONE)
|
|
||||||
private MenuManager menuManager;
|
private MenuManager menuManager;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@Getter(AccessLevel.NONE)
|
|
||||||
private EventBus eventBus;
|
private EventBus eventBus;
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private final Set<DecorativeObject> abyssObjects = new HashSet<>();
|
private final Set<DecorativeObject> abyssObjects = new HashSet<>();
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private boolean degradedPouchInInventory;
|
private boolean degradedPouchInInventory;
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private boolean degradingNotification;
|
private boolean degradingNotification;
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private boolean essPouch;
|
private boolean essPouch;
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private boolean hightlightDarkMage;
|
private boolean hightlightDarkMage;
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private boolean lavas;
|
private boolean lavas;
|
||||||
private boolean showAir;
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private boolean showBlood;
|
|
||||||
private boolean showBody;
|
|
||||||
private boolean showChaos;
|
|
||||||
private boolean showClickBox;
|
private boolean showClickBox;
|
||||||
private boolean showCosmic;
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private boolean showDeath;
|
|
||||||
private boolean showEarth;
|
|
||||||
private boolean showFire;
|
|
||||||
private boolean showLaw;
|
|
||||||
private boolean showMind;
|
|
||||||
private boolean showNature;
|
|
||||||
private boolean showRifts;
|
private boolean showRifts;
|
||||||
private boolean showSoul;
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private boolean showWater;
|
|
||||||
private NPC darkMage;
|
private NPC darkMage;
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@@ -147,8 +149,8 @@ public class RunecraftPlugin extends Plugin
|
|||||||
{
|
{
|
||||||
updateConfig();
|
updateConfig();
|
||||||
addSubscriptions();
|
addSubscriptions();
|
||||||
abyssOverlay.updateConfig();
|
|
||||||
overlayManager.add(abyssOverlay);
|
overlayManager.add(abyssOverlay);
|
||||||
|
overlayManager.add(abyssMinimapOverlay);
|
||||||
overlayManager.add(runecraftOverlay);
|
overlayManager.add(runecraftOverlay);
|
||||||
handleSwaps();
|
handleSwaps();
|
||||||
}
|
}
|
||||||
@@ -161,6 +163,7 @@ public class RunecraftPlugin extends Plugin
|
|||||||
darkMage = null;
|
darkMage = null;
|
||||||
degradedPouchInInventory = false;
|
degradedPouchInInventory = false;
|
||||||
overlayManager.remove(abyssOverlay);
|
overlayManager.remove(abyssOverlay);
|
||||||
|
overlayManager.remove(abyssMinimapOverlay);
|
||||||
overlayManager.remove(runecraftOverlay);
|
overlayManager.remove(runecraftOverlay);
|
||||||
removeSwaps();
|
removeSwaps();
|
||||||
}
|
}
|
||||||
@@ -185,7 +188,6 @@ public class RunecraftPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateConfig();
|
updateConfig();
|
||||||
abyssOverlay.updateConfig();
|
|
||||||
|
|
||||||
if (event.getKey().equals("essPouch") || event.getKey().equals("Lavas"))
|
if (event.getKey().equals("essPouch") || event.getKey().equals("Lavas"))
|
||||||
{
|
{
|
||||||
@@ -336,19 +338,65 @@ public class RunecraftPlugin extends Plugin
|
|||||||
this.hightlightDarkMage = config.hightlightDarkMage();
|
this.hightlightDarkMage = config.hightlightDarkMage();
|
||||||
this.degradingNotification = config.degradingNotification();
|
this.degradingNotification = config.degradingNotification();
|
||||||
this.showRifts = config.showRifts();
|
this.showRifts = config.showRifts();
|
||||||
this.showAir = config.showAir();
|
|
||||||
this.showBlood = config.showBlood();
|
|
||||||
this.showBody = config.showBody();
|
|
||||||
this.showChaos = config.showChaos();
|
|
||||||
this.showCosmic = config.showCosmic();
|
|
||||||
this.showDeath = config.showDeath();
|
|
||||||
this.showEarth = config.showEarth();
|
|
||||||
this.showFire = config.showFire();
|
|
||||||
this.showLaw = config.showLaw();
|
|
||||||
this.showMind = config.showMind();
|
|
||||||
this.showNature = config.showNature();
|
|
||||||
this.showSoul = config.showSoul();
|
|
||||||
this.showWater = config.showWater();
|
|
||||||
this.showClickBox = config.showClickBox();
|
this.showClickBox = config.showClickBox();
|
||||||
|
|
||||||
|
updateRifts();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private void updateRifts()
|
||||||
|
{
|
||||||
|
rifts.clear();
|
||||||
|
if (config.showAir())
|
||||||
|
{
|
||||||
|
rifts.add(AIR_RIFT);
|
||||||
|
}
|
||||||
|
if (config.showBlood())
|
||||||
|
{
|
||||||
|
rifts.add(BLOOD_RIFT);
|
||||||
|
}
|
||||||
|
if (config.showBody())
|
||||||
|
{
|
||||||
|
rifts.add(BODY_RIFT);
|
||||||
|
}
|
||||||
|
if (config.showChaos())
|
||||||
|
{
|
||||||
|
rifts.add(CHAOS_RIFT);
|
||||||
|
}
|
||||||
|
if (config.showCosmic())
|
||||||
|
{
|
||||||
|
rifts.add(COSMIC_RIFT);
|
||||||
|
}
|
||||||
|
if (config.showDeath())
|
||||||
|
{
|
||||||
|
rifts.add(DEATH_RIFT);
|
||||||
|
}
|
||||||
|
if (config.showEarth())
|
||||||
|
{
|
||||||
|
rifts.add(EARTH_RIFT);
|
||||||
|
}
|
||||||
|
if (config.showFire())
|
||||||
|
{
|
||||||
|
rifts.add(FIRE_RIFT);
|
||||||
|
}
|
||||||
|
if (config.showLaw())
|
||||||
|
{
|
||||||
|
rifts.add(LAW_RIFT);
|
||||||
|
}
|
||||||
|
if (config.showMind())
|
||||||
|
{
|
||||||
|
rifts.add(MIND_RIFT);
|
||||||
|
}
|
||||||
|
if (config.showNature())
|
||||||
|
{
|
||||||
|
rifts.add(NATURE_RIFT);
|
||||||
|
}
|
||||||
|
if (config.showSoul())
|
||||||
|
{
|
||||||
|
rifts.add(SOUL_RIFT);
|
||||||
|
}
|
||||||
|
if (config.showWater())
|
||||||
|
{
|
||||||
|
rifts.add(WATER_RIFT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -98,6 +98,82 @@ public class ChatNotificationsPluginTest
|
|||||||
verify(messageNode).setValue("<colHIGHLIGHT>Deathbeam<colNORMAL>, <colHIGHLIGHT>Deathbeam<colNORMAL> OSRS");
|
verify(messageNode).setValue("<colHIGHLIGHT>Deathbeam<colNORMAL>, <colHIGHLIGHT>Deathbeam<colNORMAL> OSRS");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testColor()
|
||||||
|
{
|
||||||
|
when(config.highlightWordsString()).thenReturn("you. It");
|
||||||
|
|
||||||
|
String message = "Your dodgy necklace protects you. <col=ff0000>It has 1 charge left.</col>";
|
||||||
|
MessageNode messageNode = mock(MessageNode.class);
|
||||||
|
when(messageNode.getValue()).thenReturn(message);
|
||||||
|
|
||||||
|
ChatMessage chatMessage = new ChatMessage();
|
||||||
|
chatMessage.setType(ChatMessageType.PUBLICCHAT);
|
||||||
|
chatMessage.setMessageNode(messageNode);
|
||||||
|
|
||||||
|
chatNotificationsPlugin.startUp(); // load highlight config
|
||||||
|
chatNotificationsPlugin.onChatMessage(chatMessage);
|
||||||
|
|
||||||
|
verify(messageNode).setValue("Your dodgy necklace protects <colHIGHLIGHT>you. It<col=ff0000> has 1 charge left.</col>");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPreceedingColor()
|
||||||
|
{
|
||||||
|
when(config.highlightWordsString()).thenReturn("you. It");
|
||||||
|
|
||||||
|
String message = "Your dodgy <col=00ff00>necklace protects you. It has 1 charge left.</col>";
|
||||||
|
MessageNode messageNode = mock(MessageNode.class);
|
||||||
|
when(messageNode.getValue()).thenReturn(message);
|
||||||
|
|
||||||
|
ChatMessage chatMessage = new ChatMessage();
|
||||||
|
chatMessage.setType(ChatMessageType.PUBLICCHAT);
|
||||||
|
chatMessage.setMessageNode(messageNode);
|
||||||
|
|
||||||
|
chatNotificationsPlugin.startUp(); // load highlight config
|
||||||
|
chatNotificationsPlugin.onChatMessage(chatMessage);
|
||||||
|
|
||||||
|
verify(messageNode).setValue("Your dodgy <col=00ff00>necklace protects <colHIGHLIGHT>you. It<col=00ff00> has 1 charge left.</col>");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEmoji()
|
||||||
|
{
|
||||||
|
when(config.highlightWordsString()).thenReturn("test");
|
||||||
|
|
||||||
|
String message = "emoji test <img=29>";
|
||||||
|
MessageNode messageNode = mock(MessageNode.class);
|
||||||
|
when(messageNode.getValue()).thenReturn(message);
|
||||||
|
|
||||||
|
ChatMessage chatMessage = new ChatMessage();
|
||||||
|
chatMessage.setType(ChatMessageType.PUBLICCHAT);
|
||||||
|
chatMessage.setMessageNode(messageNode);
|
||||||
|
|
||||||
|
chatNotificationsPlugin.startUp(); // load highlight config
|
||||||
|
chatNotificationsPlugin.onChatMessage(chatMessage);
|
||||||
|
|
||||||
|
verify(messageNode).setValue("emoji <colHIGHLIGHT>test<colNORMAL> <img=29>");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNonMatchedColors()
|
||||||
|
{
|
||||||
|
when(config.highlightWordsString()).thenReturn("test");
|
||||||
|
|
||||||
|
String message = "<col=ff0000>color</col> test <img=29>";
|
||||||
|
MessageNode messageNode = mock(MessageNode.class);
|
||||||
|
when(messageNode.getValue()).thenReturn(message);
|
||||||
|
|
||||||
|
ChatMessage chatMessage = new ChatMessage();
|
||||||
|
chatMessage.setType(ChatMessageType.PUBLICCHAT);
|
||||||
|
chatMessage.setMessageNode(messageNode);
|
||||||
|
|
||||||
|
chatNotificationsPlugin.startUp(); // load highlight config
|
||||||
|
chatNotificationsPlugin.onChatMessage(chatMessage);
|
||||||
|
|
||||||
|
verify(messageNode).setValue("<col=ff0000>color</col> <colHIGHLIGHT>test<colNORMAL> <img=29>");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void highlightListTest()
|
public void highlightListTest()
|
||||||
{
|
{
|
||||||
@@ -111,4 +187,10 @@ public class ChatNotificationsPluginTest
|
|||||||
assertEquals("a", iterator.next());
|
assertEquals("a", iterator.next());
|
||||||
assertEquals("test", iterator.next());
|
assertEquals("test", iterator.next());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStripColor()
|
||||||
|
{
|
||||||
|
assertEquals("you. It", ChatNotificationsPlugin.stripColor("you. <col=ff0000>It"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019 Hydrox6 <ikada@protonmail.ch>
|
||||||
|
* Copyright (c) 2019 Adam <Adam@sigterm.info>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package net.runelite.client.plugins.cluescrolls;
|
||||||
|
|
||||||
|
import net.runelite.api.coords.WorldPoint;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotEquals;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class ClueScrollPluginTest
|
||||||
|
{
|
||||||
|
@Test
|
||||||
|
public void getGetMirrorPoint()
|
||||||
|
{
|
||||||
|
WorldPoint point, converted;
|
||||||
|
|
||||||
|
// Zalcano's entrance portal
|
||||||
|
point = new WorldPoint(3282, 6058, 0);
|
||||||
|
converted = ClueScrollPlugin.getMirrorPoint(point, true);
|
||||||
|
assertNotEquals(point, converted);
|
||||||
|
|
||||||
|
// Elven Crystal Chest, which is upstairs
|
||||||
|
point = new WorldPoint(3273, 6082, 2);
|
||||||
|
converted = ClueScrollPlugin.getMirrorPoint(point, true);
|
||||||
|
assertNotEquals(point, converted);
|
||||||
|
|
||||||
|
// Around the area of the Elite coordinate clue
|
||||||
|
point = new WorldPoint(2185, 3280, 0);
|
||||||
|
// To overworld
|
||||||
|
converted = ClueScrollPlugin.getMirrorPoint(point, true);
|
||||||
|
assertEquals(point, converted);
|
||||||
|
// To real
|
||||||
|
converted = ClueScrollPlugin.getMirrorPoint(point, false);
|
||||||
|
assertNotEquals(point, converted);
|
||||||
|
|
||||||
|
// Brugsen Bursen, Grand Exchange
|
||||||
|
point = new WorldPoint(3165, 3477, 0);
|
||||||
|
converted = ClueScrollPlugin.getMirrorPoint(point, false);
|
||||||
|
assertEquals(point, converted);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,6 +33,6 @@ public class CoordinateClueTest
|
|||||||
public void testDuplicateCoordinates()
|
public void testDuplicateCoordinates()
|
||||||
{
|
{
|
||||||
// If this doesn't throw then the clues map doesn't have duplicate keys
|
// If this doesn't throw then the clues map doesn't have duplicate keys
|
||||||
new CoordinateClue("test", new WorldPoint(0, 0, 0));
|
new CoordinateClue("test", new WorldPoint(0, 0, 0), null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user