Use built-in name rendering in player indicators

- Change player indicators to use built-in player name rendering
- Add support for drawing clan member rank icons thanks to built-in
player name rendering

Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
This commit is contained in:
Tomas Slusny
2018-03-28 12:22:11 +02:00
committed by Adam
parent 7c233a096c
commit 5044e40bdd
5 changed files with 158 additions and 29 deletions

View File

@@ -55,7 +55,7 @@ public interface PlayerIndicatorsConfig extends Config
) )
default Color getOwnNameColor() default Color getOwnNameColor()
{ {
return new Color(0, 184, 212); return Color.WHITE;
} }
@ConfigItem( @ConfigItem(
@@ -110,7 +110,7 @@ public interface PlayerIndicatorsConfig extends Config
) )
default boolean drawTeamMemberNames() default boolean drawTeamMemberNames()
{ {
return true; return false;
} }
@ConfigItem( @ConfigItem(
@@ -126,11 +126,11 @@ public interface PlayerIndicatorsConfig extends Config
@ConfigItem( @ConfigItem(
position = 8, position = 8,
keyName = "drawNonClanMemberNames", keyName = "drawOthers",
name = "Draw non-clan member names", name = "Draw names of others",
description = "Configures whether or not names of non-clan members should be drawn" description = "Configures whether or not names of everyone except you should be drawn"
) )
default boolean drawNonClanMemberNames() default boolean drawNonOwnNames()
{ {
return false; return false;
} }
@@ -141,9 +141,9 @@ public interface PlayerIndicatorsConfig extends Config
name = "Non-clan member color", name = "Non-clan member color",
description = "Color of non-clan member names" description = "Color of non-clan member names"
) )
default Color getNonClanMemberColor() default Color getNonOwnColor()
{ {
return Color.RED; return Color.WHITE;
} }
@ConfigItem( @ConfigItem(

View File

@@ -35,6 +35,7 @@ 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.OverlayPriority;
import net.runelite.client.ui.overlay.OverlayUtil; import net.runelite.client.ui.overlay.OverlayUtil;
import net.runelite.client.util.Text;
@Singleton @Singleton
public class PlayerIndicatorsMinimapOverlay extends Overlay public class PlayerIndicatorsMinimapOverlay extends Overlay
@@ -61,7 +62,7 @@ public class PlayerIndicatorsMinimapOverlay extends Overlay
private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color) private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color)
{ {
final String name = actor.getName().replace('\u00A0', ' '); final String name = Text.removeTags(actor.getName());
if (config.drawMinimapNames()) if (config.drawMinimapNames())
{ {

View File

@@ -32,6 +32,7 @@ import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import net.runelite.api.Player; import net.runelite.api.Player;
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.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.OverlayPriority;
import net.runelite.client.ui.overlay.OverlayUtil; import net.runelite.client.ui.overlay.OverlayUtil;
@@ -47,35 +48,29 @@ public class PlayerIndicatorsOverlay extends Overlay
{ {
this.config = config; this.config = config;
this.playerIndicatorsService = playerIndicatorsService; this.playerIndicatorsService = playerIndicatorsService;
setLayer(OverlayLayer.ABOVE_SCENE);
setPosition(OverlayPosition.DYNAMIC); setPosition(OverlayPosition.DYNAMIC);
setPriority(OverlayPriority.HIGH); setPriority(OverlayPriority.LOW);
} }
@Override @Override
public Dimension render(Graphics2D graphics) public Dimension render(Graphics2D graphics)
{ {
playerIndicatorsService.forEachPlayer((player, color) -> renderPlayerOverlay(graphics, player, color)); if (config.drawTiles())
{
playerIndicatorsService.forEachPlayer((player, color) -> renderPlayerOverlay(graphics, player, color));
}
return null; return null;
} }
private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color) private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color)
{ {
if (config.drawTiles()) Polygon poly = actor.getCanvasTilePoly();
{
Polygon poly = actor.getCanvasTilePoly();
if (poly != null)
{
OverlayUtil.renderPolygon(graphics, poly, color);
}
}
final String name = actor.getName().replace('\u00A0', ' '); if (poly != null)
net.runelite.api.Point textLocation = actor
.getCanvasTextLocation(graphics, name, actor.getLogicalHeight() + 40);
if (textLocation != null)
{ {
OverlayUtil.renderTextLocation(graphics, textLocation, name, color); OverlayUtil.renderPolygon(graphics, poly, color);
} }
} }
} }

View File

@@ -25,12 +25,16 @@
package net.runelite.client.plugins.playerindicators; package net.runelite.client.plugins.playerindicators;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.google.common.eventbus.Subscribe;
import com.google.inject.Provides; import com.google.inject.Provides;
import java.time.temporal.ChronoUnit;
import java.util.Collection; import java.util.Collection;
import javax.inject.Inject; import javax.inject.Inject;
import net.runelite.api.events.ConfigChanged;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
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.task.Schedule;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
@PluginDescriptor( @PluginDescriptor(
@@ -38,12 +42,16 @@ import net.runelite.client.ui.overlay.Overlay;
) )
public class PlayerIndicatorsPlugin extends Plugin public class PlayerIndicatorsPlugin extends Plugin
{ {
@Inject @Inject
private PlayerIndicatorsOverlay playerIndicatorsOverlay; private PlayerIndicatorsOverlay playerIndicatorsOverlay;
@Inject @Inject
private PlayerIndicatorsMinimapOverlay playerIndicatorsMinimapOverlay; private PlayerIndicatorsMinimapOverlay playerIndicatorsMinimapOverlay;
@Inject
private PlayerIndicatorsService playerIndicatorsService;
@Provides @Provides
PlayerIndicatorsConfig provideConfig(ConfigManager configManager) PlayerIndicatorsConfig provideConfig(ConfigManager configManager)
{ {
@@ -55,4 +63,36 @@ public class PlayerIndicatorsPlugin extends Plugin
{ {
return Sets.newHashSet(playerIndicatorsOverlay, playerIndicatorsMinimapOverlay); return Sets.newHashSet(playerIndicatorsOverlay, playerIndicatorsMinimapOverlay);
} }
@Override
protected void startUp()
{
playerIndicatorsService.updateConfig(false);
}
@Override
protected void shutDown()
{
playerIndicatorsService.updateConfig(true);
}
@Subscribe
public void onConfigChanged(ConfigChanged event)
{
if (event.getGroup().equals("playerindicators")
|| event.getGroup().equals("runelite")
|| event.getGroup().equals("minimap"))
{
playerIndicatorsService.updateConfig(false);
}
}
@Schedule(
period = 1,
unit = ChronoUnit.SECONDS
)
public void updatePlayerNames()
{
playerIndicatorsService.updatePlayers();
}
} }

View File

@@ -28,12 +28,18 @@ import java.awt.Color;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import net.runelite.api.ClanMember;
import net.runelite.api.ClanMemberRank;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.IndexedSprite;
import net.runelite.api.Player; import net.runelite.api.Player;
import net.runelite.api.PlayerNameMask;
import net.runelite.client.util.Text;
@Singleton @Singleton
public class PlayerIndicatorsService public class PlayerIndicatorsService
{ {
private static final int NUMBER_OF_RANKS = 8;
private final Client client; private final Client client;
private final PlayerIndicatorsConfig config; private final PlayerIndicatorsConfig config;
@@ -44,10 +50,56 @@ public class PlayerIndicatorsService
this.client = client; this.client = client;
} }
public void updateConfig(boolean reset)
{
// Update mask
int baseMask = 0;
if (!reset)
{
if (config.drawFriendNames())
{
baseMask |= PlayerNameMask.DRAW_FRIEND_NAME;
}
if (config.drawClanMemberNames())
{
baseMask |= PlayerNameMask.DRAW_CLAN_NAME;
}
if (config.drawOwnName())
{
baseMask |= PlayerNameMask.DRAW_OWN_NAME;
}
if (config.drawNonOwnNames())
{
baseMask |= PlayerNameMask.DRAW_ALL_EXCEPT_OWN_NAME;
}
}
client.setPlayerNameMask(baseMask);
for (Player player : client.getPlayers())
{
if (player != null && player.getName() != null)
{
player.setName(Text.removeTags(player.getName()));
}
}
}
public void updatePlayers()
{
// Update player names
forEachPlayer(this::injectData);
}
public void forEachPlayer(final BiConsumer<Player, Color> consumer) public void forEachPlayer(final BiConsumer<Player, Color> consumer)
{ {
if (!config.drawOwnName() && !config.drawClanMemberNames() if (!config.drawOwnName() && !config.drawClanMemberNames()
&& !config.drawFriendNames() && !config.drawNonClanMemberNames()) && !config.drawFriendNames() && !config.drawNonOwnNames()
&& !config.drawTeamMemberNames())
{ {
return; return;
} }
@@ -63,7 +115,7 @@ public class PlayerIndicatorsService
boolean isClanMember = player.isClanMember(); boolean isClanMember = player.isClanMember();
if (player == client.getLocalPlayer()) if (player == localPlayer)
{ {
if (config.drawOwnName()) if (config.drawOwnName())
{ {
@@ -82,10 +134,51 @@ public class PlayerIndicatorsService
{ {
consumer.accept(player, config.getTeamMemberColor()); consumer.accept(player, config.getTeamMemberColor());
} }
else if (config.drawNonClanMemberNames() && !isClanMember) else if (config.drawNonOwnNames())
{ {
consumer.accept(player, config.getNonClanMemberColor()); consumer.accept(player, config.getNonOwnColor());
} }
} }
} }
private void injectData(final Player player, final Color color)
{
final StringBuilder stringBuilder = new StringBuilder();
final IndexedSprite[] modIcons = client.getModIcons();
final int startIndex = modIcons.length - NUMBER_OF_RANKS;
final String strippedName = Text.removeTags(player.getName());
if (startIndex >= 0 && player.isClanMember())
{
final ClanMember[] clanMembersArr = client.getClanMembers();
if (clanMembersArr != null && clanMembersArr.length > 0)
{
for (ClanMember clanMember : clanMembersArr)
{
if (clanMember != null && clanMember.getUsername().equals(strippedName))
{
if (clanMember.getRank() != ClanMemberRank.UNRANKED)
{
stringBuilder
.append("<img=")
.append(startIndex + clanMember.getRank().getValue())
.append(">");
}
break;
}
}
}
}
stringBuilder.append("<col=").append(parseColor(color)).append(">");
player.setName(stringBuilder.toString() + strippedName);
}
private static String parseColor(final Color color)
{
return String.format("%02X%02X%02X", color.getRed(), color.getGreen(), color.getBlue());
}
} }