From 24e6b242002298691dfca1fc5daf0ef92719de31 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Tue, 27 Mar 2018 23:15:20 +0200 Subject: [PATCH 1/8] Add support for drawing player team's names Add support for drawing player names and indicators for players in same team as actual player. Signed-off-by: Tomas Slusny --- .../PlayerIndicatorsConfig.java | 28 +++++++++++++++++-- .../PlayerIndicatorsService.java | 6 ++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java index 3475bc44af..b5c204d557 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java @@ -104,6 +104,28 @@ public interface PlayerIndicatorsConfig extends Config @ConfigItem( position = 6, + keyName = "drawTeamMemberNames", + name = "Draw team member names", + description = "Configures whether or not names of player's team members should be drawn" + ) + default boolean drawTeamMemberNames() + { + return true; + } + + @ConfigItem( + position = 7, + keyName = "teamMemberColor", + name = "Team member color", + description = "Color of team member names" + ) + default Color getTeamMemberColor() + { + return new Color(19, 110, 247); + } + + @ConfigItem( + position = 8, keyName = "drawNonClanMemberNames", name = "Draw non-clan member names", description = "Configures whether or not names of non-clan members should be drawn" @@ -114,7 +136,7 @@ public interface PlayerIndicatorsConfig extends Config } @ConfigItem( - position = 7, + position = 9, keyName = "nonClanMemberColor", name = "Non-clan member color", description = "Color of non-clan member names" @@ -125,7 +147,7 @@ public interface PlayerIndicatorsConfig extends Config } @ConfigItem( - position = 8, + position = 10, keyName = "drawPlayerTiles", name = "Draw tiles", description = "Configures whether or not tiles under players with rendered names should be drawn" @@ -136,7 +158,7 @@ public interface PlayerIndicatorsConfig extends Config } @ConfigItem( - position = 9, + position = 11, keyName = "drawMinimapNames", name = "Draw names on minimap", description = "Configures whether or not minimap names for players with rendered names should be drawn" diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java index b04c702444..cebddec3c8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java @@ -52,6 +52,8 @@ public class PlayerIndicatorsService return; } + final Player localPlayer = client.getLocalPlayer(); + for (Player player : client.getPlayers()) { if (player == null || player.getName() == null) @@ -76,6 +78,10 @@ public class PlayerIndicatorsService { consumer.accept(player, config.getClanMemberColor()); } + else if (config.drawTeamMemberNames() && localPlayer.getTeam() > 0 && localPlayer.getTeam() == player.getTeam()) + { + consumer.accept(player, config.getTeamMemberColor()); + } else if (config.drawNonClanMemberNames() && !isClanMember) { consumer.accept(player, config.getNonClanMemberColor()); From 7c233a096c1a96f341c0145416799f60e7d59b79 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Wed, 28 Mar 2018 12:21:11 +0200 Subject: [PATCH 2/8] Add mappings and api for DMM player names - Add mappings for DMM player names and methods using them - Create class with DMM player name rendering masks - Create mapping for cleanName from player - Create mapping for setting name to player Signed-off-by: Tomas Slusny --- .../main/java/net/runelite/api/Client.java | 4 +++ .../main/java/net/runelite/api/Player.java | 4 +++ .../java/net/runelite/api/PlayerNameMask.java | 33 +++++++++++++++++++ .../net/runelite/mixins/RSPlayerMixin.java | 28 ++++++++++++++++ .../java/net/runelite/rs/api/RSClient.java | 8 +++++ .../main/java/net/runelite/rs/api/RSName.java | 6 ++++ 6 files changed, 83 insertions(+) create mode 100644 runelite-api/src/main/java/net/runelite/api/PlayerNameMask.java diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index aeed397d4d..c781270dc4 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -350,4 +350,8 @@ public interface Client extends GameEngine World createWorld(); SpritePixels drawInstanceMap(int z); + + void setPlayerNameMask(int mask); + + int getPlayerNameMask(); } diff --git a/runelite-api/src/main/java/net/runelite/api/Player.java b/runelite-api/src/main/java/net/runelite/api/Player.java index 6ea285b3d1..0f7ec9f041 100644 --- a/runelite-api/src/main/java/net/runelite/api/Player.java +++ b/runelite-api/src/main/java/net/runelite/api/Player.java @@ -31,6 +31,10 @@ public interface Player extends Actor @Override int getCombatLevel(); + String getCleanName(); + + void setName(String name); + PlayerComposition getPlayerComposition(); Polygon[] getPolygons(); diff --git a/runelite-api/src/main/java/net/runelite/api/PlayerNameMask.java b/runelite-api/src/main/java/net/runelite/api/PlayerNameMask.java new file mode 100644 index 0000000000..a50a0a3276 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/PlayerNameMask.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * 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.api; + +public class PlayerNameMask +{ + public static final int DRAW_FRIEND_NAME = 1; + public static final int DRAW_CLAN_NAME = 2; + public static final int DRAW_ALL_EXCEPT_OWN_NAME = 4; + public static final int DRAW_OWN_NAME = 8; +} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java index 4981d760f5..8cf3cd6056 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java @@ -66,6 +66,34 @@ public abstract class RSPlayerMixin implements RSPlayer return name.replace('\u00A0', ' '); } + @Inject + @Override + public String getCleanName() + { + final RSName rsName = getRsName(); + + if (rsName == null) + { + return null; + } + + return rsName.getCleanName(); + } + + @Inject + @Override + public void setName(String name) + { + final RSName rsName = getRsName(); + + if (rsName == null) + { + return; + } + + rsName.setName(name); + } + @Inject @Override public Polygon[] getPolygons() diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index 57a5a661c6..f6340c4c85 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -549,4 +549,12 @@ public interface RSClient extends RSGameEngine, Client @Import("drawObject") void drawObject(int z, int x, int y, int randomColor1, int randomColor2); + + @Import("playerNameMask") + @Override + void setPlayerNameMask(int mask); + + @Import("playerNameMask") + @Override + int getPlayerNameMask(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSName.java b/runescape-api/src/main/java/net/runelite/rs/api/RSName.java index bbd4f9abfd..768edaab81 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSName.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSName.java @@ -30,4 +30,10 @@ public interface RSName { @Import("name") String getName(); + + @Import("cleanName") + String getCleanName(); + + @Import("name") + void setName(String name); } From 5044e40bddcf6dbb48971527e1bf3e73c9bcb2b0 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Wed, 28 Mar 2018 12:22:11 +0200 Subject: [PATCH 3/8] 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 --- .../PlayerIndicatorsConfig.java | 16 +-- .../PlayerIndicatorsMinimapOverlay.java | 3 +- .../PlayerIndicatorsOverlay.java | 27 ++--- .../PlayerIndicatorsPlugin.java | 40 +++++++ .../PlayerIndicatorsService.java | 101 +++++++++++++++++- 5 files changed, 158 insertions(+), 29 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java index b5c204d557..7e767f42e0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java @@ -55,7 +55,7 @@ public interface PlayerIndicatorsConfig extends Config ) default Color getOwnNameColor() { - return new Color(0, 184, 212); + return Color.WHITE; } @ConfigItem( @@ -110,7 +110,7 @@ public interface PlayerIndicatorsConfig extends Config ) default boolean drawTeamMemberNames() { - return true; + return false; } @ConfigItem( @@ -126,11 +126,11 @@ public interface PlayerIndicatorsConfig extends Config @ConfigItem( position = 8, - keyName = "drawNonClanMemberNames", - name = "Draw non-clan member names", - description = "Configures whether or not names of non-clan members should be drawn" + keyName = "drawOthers", + name = "Draw names of others", + description = "Configures whether or not names of everyone except you should be drawn" ) - default boolean drawNonClanMemberNames() + default boolean drawNonOwnNames() { return false; } @@ -141,9 +141,9 @@ public interface PlayerIndicatorsConfig extends Config name = "Non-clan member color", description = "Color of non-clan member names" ) - default Color getNonClanMemberColor() + default Color getNonOwnColor() { - return Color.RED; + return Color.WHITE; } @ConfigItem( diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java index 266def094c..036efc8d7f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java @@ -35,6 +35,7 @@ import net.runelite.client.ui.overlay.OverlayLayer; 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.util.Text; @Singleton public class PlayerIndicatorsMinimapOverlay extends Overlay @@ -61,7 +62,7 @@ public class PlayerIndicatorsMinimapOverlay extends Overlay 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()) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java index 6dce1e04ff..ec70c478a7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java @@ -32,6 +32,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import net.runelite.api.Player; 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.OverlayPriority; import net.runelite.client.ui.overlay.OverlayUtil; @@ -47,35 +48,29 @@ public class PlayerIndicatorsOverlay extends Overlay { this.config = config; this.playerIndicatorsService = playerIndicatorsService; + setLayer(OverlayLayer.ABOVE_SCENE); setPosition(OverlayPosition.DYNAMIC); - setPriority(OverlayPriority.HIGH); + setPriority(OverlayPriority.LOW); } @Override 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; } private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color) { - if (config.drawTiles()) - { - Polygon poly = actor.getCanvasTilePoly(); - if (poly != null) - { - OverlayUtil.renderPolygon(graphics, poly, color); - } - } + Polygon poly = actor.getCanvasTilePoly(); - final String name = actor.getName().replace('\u00A0', ' '); - net.runelite.api.Point textLocation = actor - .getCanvasTextLocation(graphics, name, actor.getLogicalHeight() + 40); - - if (textLocation != null) + if (poly != null) { - OverlayUtil.renderTextLocation(graphics, textLocation, name, color); + OverlayUtil.renderPolygon(graphics, poly, color); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java index 914eaf431d..a3bf22096e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java @@ -25,12 +25,16 @@ package net.runelite.client.plugins.playerindicators; import com.google.common.collect.Sets; +import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; +import java.time.temporal.ChronoUnit; import java.util.Collection; import javax.inject.Inject; +import net.runelite.api.events.ConfigChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.task.Schedule; import net.runelite.client.ui.overlay.Overlay; @PluginDescriptor( @@ -38,12 +42,16 @@ import net.runelite.client.ui.overlay.Overlay; ) public class PlayerIndicatorsPlugin extends Plugin { + @Inject private PlayerIndicatorsOverlay playerIndicatorsOverlay; @Inject private PlayerIndicatorsMinimapOverlay playerIndicatorsMinimapOverlay; + @Inject + private PlayerIndicatorsService playerIndicatorsService; + @Provides PlayerIndicatorsConfig provideConfig(ConfigManager configManager) { @@ -55,4 +63,36 @@ public class PlayerIndicatorsPlugin extends Plugin { 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(); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java index cebddec3c8..9c13707957 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java @@ -28,12 +28,18 @@ import java.awt.Color; import java.util.function.BiConsumer; import javax.inject.Inject; import javax.inject.Singleton; +import net.runelite.api.ClanMember; +import net.runelite.api.ClanMemberRank; import net.runelite.api.Client; +import net.runelite.api.IndexedSprite; import net.runelite.api.Player; +import net.runelite.api.PlayerNameMask; +import net.runelite.client.util.Text; @Singleton public class PlayerIndicatorsService { + private static final int NUMBER_OF_RANKS = 8; private final Client client; private final PlayerIndicatorsConfig config; @@ -44,10 +50,56 @@ public class PlayerIndicatorsService 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 consumer) { if (!config.drawOwnName() && !config.drawClanMemberNames() - && !config.drawFriendNames() && !config.drawNonClanMemberNames()) + && !config.drawFriendNames() && !config.drawNonOwnNames() + && !config.drawTeamMemberNames()) { return; } @@ -63,7 +115,7 @@ public class PlayerIndicatorsService boolean isClanMember = player.isClanMember(); - if (player == client.getLocalPlayer()) + if (player == localPlayer) { if (config.drawOwnName()) { @@ -82,10 +134,51 @@ public class PlayerIndicatorsService { 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(""); + } + + break; + } + } + } + } + + stringBuilder.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()); + } } From 59ad536fa97623c315849b9374371d8feafb0a73 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Wed, 28 Mar 2018 13:15:39 +0200 Subject: [PATCH 4/8] Merge clan chat and player indicators plugin As the only purpose of clan chat was to add clan chat icons for players in CC, this functionality can be done too from Player Indicators plugin. Signed-off-by: Tomas Slusny --- .../plugins/clanchat/ClanChatPlugin.java | 258 ------------------ .../PlayerIndicatorsConfig.java | 11 + .../PlayerIndicatorsMinimapOverlay.java | 16 +- .../PlayerIndicatorsPlugin.java | 40 +++ .../PlayerIndicatorsService.java | 213 ++++++++++++--- .../Captain_clan_rank.png | Bin .../Corporal_clan_rank.png | Bin .../Friend_clan_rank.png | Bin .../General_clan_rank.png | Bin .../Lieutenant_clan_rank.png | Bin .../Owner_clan_rank.png | Bin .../Recruit_clan_rank.png | Bin .../Sergeant_clan_rank.png | Bin 13 files changed, 240 insertions(+), 298 deletions(-) delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java rename runelite-client/src/main/resources/net/runelite/client/plugins/{clanchat => playerindicators}/Captain_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{clanchat => playerindicators}/Corporal_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{clanchat => playerindicators}/Friend_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{clanchat => playerindicators}/General_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{clanchat => playerindicators}/Lieutenant_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{clanchat => playerindicators}/Owner_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{clanchat => playerindicators}/Recruit_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{clanchat => playerindicators}/Sergeant_clan_rank.png (100%) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java deleted file mode 100644 index 1fc391d383..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright (c) 2017, Devin French - * 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.clanchat; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.google.common.eventbus.Subscribe; -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.DataBufferByte; -import java.awt.image.IndexColorModel; -import java.awt.image.WritableRaster; -import java.io.IOException; -import java.time.temporal.ChronoUnit; -import java.util.Arrays; -import java.util.Objects; -import java.util.concurrent.TimeUnit; -import javax.imageio.ImageIO; -import javax.inject.Inject; -import lombok.extern.slf4j.Slf4j; -import net.runelite.api.ChatMessageType; -import net.runelite.api.ClanMember; -import net.runelite.api.ClanMemberRank; -import net.runelite.api.Client; -import net.runelite.api.GameState; -import net.runelite.api.IndexedSprite; -import net.runelite.api.events.GameStateChanged; -import net.runelite.api.events.SetMessage; -import net.runelite.api.widgets.Widget; -import net.runelite.api.widgets.WidgetInfo; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.task.Schedule; - -@PluginDescriptor( - name = "Clan Chat" -) -@Slf4j -public class ClanChatPlugin extends Plugin -{ - private static final String[] CLANCHAT_IMAGES = - { - "Friend_clan_rank.png", "Recruit_clan_rank.png", - "Corporal_clan_rank.png", "Sergeant_clan_rank.png", - "Lieutenant_clan_rank.png", "Captain_clan_rank.png", - "General_clan_rank.png", "Owner_clan_rank.png" - }; - - - private final LoadingCache clanRanksCache = CacheBuilder.newBuilder() - .maximumSize(100) - .expireAfterAccess(1, TimeUnit.MINUTES) - .build(new CacheLoader() - { - @Override - public ClanMemberRank load(String key) throws Exception - { - final ClanMember[] clanMembersArr = client.getClanMembers(); - - if (clanMembersArr == null || clanMembersArr.length == 0) - { - return ClanMemberRank.UNRANKED; - } - - return Arrays.stream(clanMembersArr) - .filter(Objects::nonNull) - .filter(clanMember -> sanitize(clanMember.getUsername()).equals(sanitize(key))) - .map(ClanMember::getRank) - .findAny() - .orElse(ClanMemberRank.UNRANKED); - } - }); - - private int modIconsLength; - - @Inject - private Client client; - - @Override - protected void startUp() throws Exception - { - if (modIconsLength == 0 && client.getGameState().compareTo(GameState.LOGIN_SCREEN) >= 0) - { - loadClanChatIcons(); - } - } - - @Override - protected void shutDown() - { - clanRanksCache.invalidateAll(); - } - - @Subscribe - public void onGameStateChanged(GameStateChanged gameStateChanged) - { - if (gameStateChanged.getGameState() == GameState.LOGIN_SCREEN - && modIconsLength == 0) - { - // this is after "Loading sprites" so we can modify modicons now - loadClanChatIcons(); - } - } - - @Schedule( - period = 600, - unit = ChronoUnit.MILLIS - ) - public void updateClanChatTitle() - { - if (client.getGameState() != GameState.LOGGED_IN) - { - return; - } - - Widget clanChatTitleWidget = client.getWidget(WidgetInfo.CLAN_CHAT_TITLE); - if (clanChatTitleWidget != null) - { - clanChatTitleWidget.setText("Clan Chat (" + client.getClanChatCount() + "/100)"); - } - } - - @Subscribe - public void onSetMessage(SetMessage setMessage) - { - if (client.getGameState() != GameState.LOADING && client.getGameState() != GameState.LOGGED_IN) - { - return; - } - - if (setMessage.getType() == ChatMessageType.CLANCHAT && client.getClanChatCount() > 0) - { - insertClanRankIcon(setMessage); - } - } - - private void loadClanChatIcons() - { - try - { - final IndexedSprite[] modIcons = client.getModIcons(); - final IndexedSprite[] newModIcons = Arrays.copyOf(modIcons, modIcons.length + CLANCHAT_IMAGES.length); - int curPosition = newModIcons.length - CLANCHAT_IMAGES.length; - - for (String resource : CLANCHAT_IMAGES) - { - IndexedSprite sprite = createIndexedSprite(resource); - newModIcons[curPosition++] = sprite; - } - - client.setModIcons(newModIcons); - modIconsLength = newModIcons.length; - } - catch (IOException e) - { - log.warn("Failed loading of clan chat icons", e); - } - } - - private IndexedSprite createIndexedSprite(final String imagePath) throws IOException - { - final BufferedImage bufferedImage = rgbaToIndexedBufferedImage(ImageIO - .read(this.getClass().getResource(imagePath))); - - final IndexColorModel indexedCM = (IndexColorModel) bufferedImage.getColorModel(); - - final int width = bufferedImage.getWidth(); - final int height = bufferedImage.getHeight(); - final byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData(); - final int[] palette = new int[indexedCM.getMapSize()]; - indexedCM.getRGBs(palette); - - final IndexedSprite newIndexedSprite = client.createIndexedSprite(); - newIndexedSprite.setPixels(pixels); - newIndexedSprite.setPalette(palette); - newIndexedSprite.setWidth(width); - newIndexedSprite.setHeight(height); - newIndexedSprite.setOriginalWidth(width); - newIndexedSprite.setOriginalHeight(height); - newIndexedSprite.setOffsetX(0); - newIndexedSprite.setOffsetY(0); - return newIndexedSprite; - } - - private static BufferedImage rgbaToIndexedBufferedImage(final BufferedImage sourceBufferedImage) - { - final BufferedImage indexedImage = new BufferedImage( - sourceBufferedImage.getWidth(), - sourceBufferedImage.getHeight(), - BufferedImage.TYPE_BYTE_INDEXED); - - final ColorModel cm = indexedImage.getColorModel(); - final IndexColorModel icm = (IndexColorModel) cm; - - final int size = icm.getMapSize(); - final byte[] reds = new byte[size]; - final byte[] greens = new byte[size]; - final byte[] blues = new byte[size]; - icm.getReds(reds); - icm.getGreens(greens); - icm.getBlues(blues); - - final WritableRaster raster = indexedImage.getRaster(); - final int pixel = raster.getSample(0, 0, 0); - final IndexColorModel resultIcm = new IndexColorModel(8, size, reds, greens, blues, pixel); - final BufferedImage resultIndexedImage = new BufferedImage(resultIcm, raster, sourceBufferedImage.isAlphaPremultiplied(), null); - resultIndexedImage.getGraphics().drawImage(sourceBufferedImage, 0, 0, null); - return resultIndexedImage; - } - - private void insertClanRankIcon(final SetMessage message) - { - final String playerName = sanitize(message.getName()); - final ClanMemberRank rank = clanRanksCache.getUnchecked(playerName); - - if (rank != null && rank != ClanMemberRank.UNRANKED) - { - int iconNumber = getIconNumber(rank); - message.getMessageNode() - .setSender(message.getMessageNode().getSender() + " "); - client.refreshChat(); - } - } - - private int getIconNumber(final ClanMemberRank clanMemberRank) - { - return modIconsLength - CLANCHAT_IMAGES.length + clanMemberRank.getValue(); - } - - private static String sanitize(String lookup) - { - final String cleaned = lookup.contains("') + 1) : lookup; - return cleaned.replace('\u00A0', ' '); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java index 7e767f42e0..b6eef9d3f7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsConfig.java @@ -167,4 +167,15 @@ public interface PlayerIndicatorsConfig extends Config { return false; } + + @ConfigItem( + position = 12, + keyName = "showClanRankIcons", + name = "Show clan member rank icons next to names", + description = "Configures whether or not icons representing rank are shown next to player names" + ) + default boolean showClanRankIcons() + { + return true; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java index 036efc8d7f..0065b8ab12 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java @@ -56,22 +56,22 @@ public class PlayerIndicatorsMinimapOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - playerIndicatorsService.forEachPlayer((player, color) -> renderPlayerOverlay(graphics, player, color)); + if (config.drawMinimapNames()) + { + playerIndicatorsService.forEachPlayer((player, color) -> renderPlayerOverlay(graphics, player, color)); + } + return null; } private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color) { final String name = Text.removeTags(actor.getName()); + final net.runelite.api.Point minimapLocation = actor.getMinimapLocation(); - if (config.drawMinimapNames()) + if (minimapLocation != null) { - final net.runelite.api.Point minimapLocation = actor.getMinimapLocation(); - - if (minimapLocation != null) - { - OverlayUtil.renderTextLocation(graphics, minimapLocation, name, color); - } + OverlayUtil.renderTextLocation(graphics, minimapLocation, name, color); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java index a3bf22096e..c044aa7940 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java @@ -30,7 +30,14 @@ import com.google.inject.Provides; import java.time.temporal.ChronoUnit; import java.util.Collection; import javax.inject.Inject; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameState; import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.SetMessage; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -42,6 +49,8 @@ import net.runelite.client.ui.overlay.Overlay; ) public class PlayerIndicatorsPlugin extends Plugin { + @Inject + private Client client; @Inject private PlayerIndicatorsOverlay playerIndicatorsOverlay; @@ -87,12 +96,43 @@ public class PlayerIndicatorsPlugin extends Plugin } } + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) + { + playerIndicatorsService.updateConfig(false); + } + + @Subscribe + public void onSetMessage(SetMessage setMessage) + { + if (client.getGameState() != GameState.LOADING && client.getGameState() != GameState.LOGGED_IN) + { + return; + } + + if (setMessage.getType() == ChatMessageType.CLANCHAT && client.getClanChatCount() > 0) + { + playerIndicatorsService.insertClanRankIcon(setMessage); + } + } + @Schedule( period = 1, unit = ChronoUnit.SECONDS ) public void updatePlayerNames() { + if (client.getGameState() != GameState.LOGGED_IN) + { + return; + } + + Widget clanChatTitleWidget = client.getWidget(WidgetInfo.CLAN_CHAT_TITLE); + if (clanChatTitleWidget != null) + { + clanChatTitleWidget.setText("Clan Chat (" + client.getClanChatCount() + "/100)"); + } + playerIndicatorsService.updatePlayers(); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java index 9c13707957..f75bd23d95 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java @@ -24,24 +24,74 @@ */ package net.runelite.client.plugins.playerindicators; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import java.awt.Color; +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.DataBufferByte; +import java.awt.image.IndexColorModel; +import java.awt.image.WritableRaster; +import java.io.IOException; +import java.util.Arrays; +import java.util.Objects; +import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; +import javax.annotation.Nonnull; +import javax.imageio.ImageIO; import javax.inject.Inject; import javax.inject.Singleton; +import lombok.extern.slf4j.Slf4j; import net.runelite.api.ClanMember; import net.runelite.api.ClanMemberRank; import net.runelite.api.Client; +import net.runelite.api.GameState; import net.runelite.api.IndexedSprite; import net.runelite.api.Player; import net.runelite.api.PlayerNameMask; +import net.runelite.api.events.SetMessage; import net.runelite.client.util.Text; @Singleton +@Slf4j public class PlayerIndicatorsService { - private static final int NUMBER_OF_RANKS = 8; + private static final String[] CLANCHAT_IMAGES = + { + "Friend_clan_rank.png", "Recruit_clan_rank.png", + "Corporal_clan_rank.png", "Sergeant_clan_rank.png", + "Lieutenant_clan_rank.png", "Captain_clan_rank.png", + "General_clan_rank.png", "Owner_clan_rank.png" + }; + + private final LoadingCache clanRanksCache = CacheBuilder.newBuilder() + .maximumSize(100) + .expireAfterWrite(1, TimeUnit.MINUTES) + .build(new CacheLoader() + { + @Override + public ClanMemberRank load(@Nonnull String key) + { + final ClanMember[] clanMembersArr = client.getClanMembers(); + + if (clanMembersArr == null || clanMembersArr.length == 0) + { + return ClanMemberRank.UNRANKED; + } + + return Arrays.stream(clanMembersArr) + .filter(Objects::nonNull) + .filter(clanMember -> clanMember.getUsername().equals(key)) + .map(ClanMember::getRank) + .findAny() + .orElse(ClanMemberRank.UNRANKED); + } + }); + private final Client client; private final PlayerIndicatorsConfig config; + private int modIconsLength; @Inject private PlayerIndicatorsService(Client client, PlayerIndicatorsConfig config) @@ -52,6 +102,27 @@ public class PlayerIndicatorsService public void updateConfig(boolean reset) { + // Update mod icons + if (modIconsLength == 0 && client.getGameState().compareTo(GameState.LOGIN_SCREEN) >= 0) + { + loadClanChatIcons(); + } + + // Reset player names + for (Player player : client.getPlayers()) + { + if (player != null && player.getName() != null) + { + player.setName(Text.removeTags(player.getName())); + } + } + + // Reset clan rank cache + if (reset) + { + clanRanksCache.invalidateAll(); + } + // Update mask int baseMask = 0; @@ -79,14 +150,6 @@ public class PlayerIndicatorsService } client.setPlayerNameMask(baseMask); - - for (Player player : client.getPlayers()) - { - if (player != null && player.getName() != null) - { - player.setName(Text.removeTags(player.getName())); - } - } } public void updatePlayers() @@ -97,8 +160,10 @@ public class PlayerIndicatorsService public void forEachPlayer(final BiConsumer consumer) { - if (!config.drawOwnName() && !config.drawClanMemberNames() - && !config.drawFriendNames() && !config.drawNonOwnNames() + if (!config.drawOwnName() + && !config.drawClanMemberNames() + && !config.drawFriendNames() + && !config.drawNonOwnNames() && !config.drawTeamMemberNames()) { return; @@ -141,35 +206,40 @@ public class PlayerIndicatorsService } } + public void insertClanRankIcon(final SetMessage message) + { + if (!config.showClanRankIcons()) + { + return; + } + + final String playerName = Text.removeTags(message.getName()); + final ClanMemberRank rank = clanRanksCache.getUnchecked(playerName); + + if (rank != null && rank != ClanMemberRank.UNRANKED) + { + int iconNumber = getIconNumber(rank); + message.getMessageNode() + .setSender(message.getMessageNode().getSender() + " "); + client.refreshChat(); + } + } + 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()) + if (config.showClanRankIcons() && player.isClanMember()) { - final ClanMember[] clanMembersArr = client.getClanMembers(); + final ClanMemberRank clanMemberRank = clanRanksCache.getUnchecked(strippedName); - if (clanMembersArr != null && clanMembersArr.length > 0) + if (clanMemberRank != ClanMemberRank.UNRANKED) { - for (ClanMember clanMember : clanMembersArr) - { - if (clanMember != null && clanMember.getUsername().equals(strippedName)) - { - if (clanMember.getRank() != ClanMemberRank.UNRANKED) - { - stringBuilder - .append(""); - } - - break; - } - } + stringBuilder + .append(""); } } @@ -181,4 +251,83 @@ public class PlayerIndicatorsService { return String.format("%02X%02X%02X", color.getRed(), color.getGreen(), color.getBlue()); } + + private void loadClanChatIcons() + { + try + { + final IndexedSprite[] modIcons = client.getModIcons(); + final IndexedSprite[] newModIcons = Arrays.copyOf(modIcons, modIcons.length + CLANCHAT_IMAGES.length); + int curPosition = newModIcons.length - CLANCHAT_IMAGES.length; + + for (String resource : CLANCHAT_IMAGES) + { + IndexedSprite sprite = createIndexedSprite(resource); + newModIcons[curPosition++] = sprite; + } + + client.setModIcons(newModIcons); + modIconsLength = newModIcons.length; + } + catch (IOException e) + { + log.warn("Failed loading of clan chat icons", e); + } + } + + private IndexedSprite createIndexedSprite(final String imagePath) throws IOException + { + final BufferedImage bufferedImage = rgbaToIndexedBufferedImage(ImageIO + .read(this.getClass().getResource(imagePath))); + + final IndexColorModel indexedCM = (IndexColorModel) bufferedImage.getColorModel(); + + final int width = bufferedImage.getWidth(); + final int height = bufferedImage.getHeight(); + final byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData(); + final int[] palette = new int[indexedCM.getMapSize()]; + indexedCM.getRGBs(palette); + + final IndexedSprite newIndexedSprite = client.createIndexedSprite(); + newIndexedSprite.setPixels(pixels); + newIndexedSprite.setPalette(palette); + newIndexedSprite.setWidth(width); + newIndexedSprite.setHeight(height); + newIndexedSprite.setOriginalWidth(width); + newIndexedSprite.setOriginalHeight(height); + newIndexedSprite.setOffsetX(0); + newIndexedSprite.setOffsetY(0); + return newIndexedSprite; + } + + private static BufferedImage rgbaToIndexedBufferedImage(final BufferedImage sourceBufferedImage) + { + final BufferedImage indexedImage = new BufferedImage( + sourceBufferedImage.getWidth(), + sourceBufferedImage.getHeight(), + BufferedImage.TYPE_BYTE_INDEXED); + + final ColorModel cm = indexedImage.getColorModel(); + final IndexColorModel icm = (IndexColorModel) cm; + + final int size = icm.getMapSize(); + final byte[] reds = new byte[size]; + final byte[] greens = new byte[size]; + final byte[] blues = new byte[size]; + icm.getReds(reds); + icm.getGreens(greens); + icm.getBlues(blues); + + final WritableRaster raster = indexedImage.getRaster(); + final int pixel = raster.getSample(0, 0, 0); + final IndexColorModel resultIcm = new IndexColorModel(8, size, reds, greens, blues, pixel); + final BufferedImage resultIndexedImage = new BufferedImage(resultIcm, raster, sourceBufferedImage.isAlphaPremultiplied(), null); + resultIndexedImage.getGraphics().drawImage(sourceBufferedImage, 0, 0, null); + return resultIndexedImage; + } + + private int getIconNumber(final ClanMemberRank clanMemberRank) + { + return modIconsLength - CLANCHAT_IMAGES.length + clanMemberRank.getValue(); + } } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Captain_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Captain_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Captain_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Captain_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Corporal_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Corporal_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Corporal_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Corporal_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Friend_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Friend_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Friend_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Friend_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/General_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/General_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/General_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/General_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Lieutenant_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Lieutenant_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Lieutenant_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Lieutenant_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Owner_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Owner_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Owner_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Owner_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Recruit_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Recruit_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Recruit_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Recruit_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Sergeant_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Sergeant_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Sergeant_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Sergeant_clan_rank.png From 52129598e50a45ba518b2889398a168617672deb Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Wed, 28 Mar 2018 15:12:47 +0200 Subject: [PATCH 5/8] Always remove tags from player.getName() - Move removal of tags to RSPlayerMixin - Remove tags from players names where needed Signed-off-by: Tomas Slusny --- .../src/main/java/net/runelite/api}/Text.java | 2 +- .../runelite/client/plugins/hiscore/HiscorePlugin.java | 3 ++- .../menuentryswapper/MenuEntrySwapperPlugin.java | 2 +- .../plugins/nightmarezone/NightmareZonePlugin.java | 2 +- .../plugins/opponentinfo/OpponentInfoOverlay.java | 2 +- .../PlayerIndicatorsMinimapOverlay.java | 3 +-- .../playerindicators/PlayerIndicatorsService.java | 10 +++++----- .../net/runelite/client/plugins/raids/RaidsPlugin.java | 2 +- .../client/plugins/screenshot/ScreenshotPlugin.java | 2 +- .../runelite/client/plugins/slayer/SlayerPlugin.java | 2 +- .../test/java/net/runelite/client/util/TextTest.java | 1 + .../main/java/net/runelite/mixins/RSPlayerMixin.java | 3 ++- 12 files changed, 18 insertions(+), 16 deletions(-) rename {runelite-client/src/main/java/net/runelite/client/util => runelite-api/src/main/java/net/runelite/api}/Text.java (98%) diff --git a/runelite-client/src/main/java/net/runelite/client/util/Text.java b/runelite-api/src/main/java/net/runelite/api/Text.java similarity index 98% rename from runelite-client/src/main/java/net/runelite/client/util/Text.java rename to runelite-api/src/main/java/net/runelite/api/Text.java index 6c6e71a7b7..bcb058c1eb 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/Text.java +++ b/runelite-api/src/main/java/net/runelite/api/Text.java @@ -22,7 +22,7 @@ * (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.util; +package net.runelite.api; /** * A set of utilities to use when dealing with text. diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java index a6bdfd20e2..4eb97876c0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java @@ -32,6 +32,7 @@ import java.util.concurrent.ScheduledExecutorService; import javax.imageio.ImageIO; import javax.inject.Inject; import javax.swing.SwingUtilities; +import net.runelite.api.Text; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.PlayerMenuOptionClicked; import net.runelite.client.config.ConfigManager; @@ -138,7 +139,7 @@ public class HiscorePlugin extends Plugin throw new RuntimeException(e); } - hiscorePanel.lookup(event.getMenuTarget()); + hiscorePanel.lookup(Text.removeTags(event.getMenuTarget())); }); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index 9701049eb6..0ac604ca26 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -37,6 +37,7 @@ import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.ItemComposition; import net.runelite.api.MenuEntry; +import net.runelite.api.Text; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.PostItemComposition; @@ -52,7 +53,6 @@ import net.runelite.client.menus.WidgetMenuOption; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.util.Text; @PluginDescriptor( name = "Menu Entry Swapper", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java index 5c1f620132..791f579f03 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java @@ -39,7 +39,7 @@ import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.util.Text; +import net.runelite.api.Text; @PluginDescriptor( name = "Nightmare Zone" diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java index 1cf8df8c98..974a2282ef 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java @@ -45,7 +45,7 @@ import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.BackgroundComponent; import net.runelite.client.ui.overlay.components.TextComponent; -import net.runelite.client.util.Text; +import net.runelite.api.Text; class OpponentInfoOverlay extends Overlay { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java index 0065b8ab12..6112fa0112 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java @@ -35,7 +35,6 @@ import net.runelite.client.ui.overlay.OverlayLayer; 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.util.Text; @Singleton public class PlayerIndicatorsMinimapOverlay extends Overlay @@ -66,7 +65,7 @@ public class PlayerIndicatorsMinimapOverlay extends Overlay private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color) { - final String name = Text.removeTags(actor.getName()); + final String name = actor.getName(); final net.runelite.api.Point minimapLocation = actor.getMinimapLocation(); if (minimapLocation != null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java index f75bd23d95..833bf3757b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java @@ -51,7 +51,7 @@ import net.runelite.api.IndexedSprite; import net.runelite.api.Player; import net.runelite.api.PlayerNameMask; import net.runelite.api.events.SetMessage; -import net.runelite.client.util.Text; +import net.runelite.api.Text; @Singleton @Slf4j @@ -113,7 +113,7 @@ public class PlayerIndicatorsService { if (player != null && player.getName() != null) { - player.setName(Text.removeTags(player.getName())); + player.setName(player.getName()); } } @@ -228,11 +228,11 @@ public class PlayerIndicatorsService private void injectData(final Player player, final Color color) { final StringBuilder stringBuilder = new StringBuilder(); - final String strippedName = Text.removeTags(player.getName()); + final String playerName = player.getName(); if (config.showClanRankIcons() && player.isClanMember()) { - final ClanMemberRank clanMemberRank = clanRanksCache.getUnchecked(strippedName); + final ClanMemberRank clanMemberRank = clanRanksCache.getUnchecked(playerName); if (clanMemberRank != ClanMemberRank.UNRANKED) { @@ -244,7 +244,7 @@ public class PlayerIndicatorsService } stringBuilder.append(""); - player.setName(stringBuilder.toString() + strippedName); + player.setName(stringBuilder.toString() + playerName); } private static String parseColor(final Color color) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java index 705e47631d..c72b75935b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java @@ -70,7 +70,7 @@ import net.runelite.client.plugins.raids.solver.LayoutSolver; import net.runelite.client.plugins.raids.solver.RotationSolver; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; -import net.runelite.client.util.Text; +import net.runelite.api.Text; @PluginDescriptor( name = "Chambers Of Xeric" 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 f723f092b5..0593afc1a2 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 @@ -78,7 +78,7 @@ import net.runelite.client.ui.FontManager; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.TitleToolbar; import net.runelite.client.ui.overlay.OverlayRenderer; -import net.runelite.client.util.Text; +import net.runelite.api.Text; import net.runelite.http.api.RuneLiteAPI; import okhttp3.Call; import okhttp3.Callback; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index 60eb7c59bd..329910d65d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -57,7 +57,7 @@ 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.infobox.InfoBoxManager; -import net.runelite.client.util.Text; +import net.runelite.api.Text; @PluginDescriptor( name = "Slayer" diff --git a/runelite-client/src/test/java/net/runelite/client/util/TextTest.java b/runelite-client/src/test/java/net/runelite/client/util/TextTest.java index b8c9fa9511..c72653d730 100644 --- a/runelite-client/src/test/java/net/runelite/client/util/TextTest.java +++ b/runelite-client/src/test/java/net/runelite/client/util/TextTest.java @@ -24,6 +24,7 @@ */ package net.runelite.client.util; +import net.runelite.api.Text; import static org.junit.Assert.assertEquals; import org.junit.Test; diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java index 8cf3cd6056..96c361269a 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java @@ -30,6 +30,7 @@ import java.util.List; import net.runelite.api.Model; import net.runelite.api.Perspective; import net.runelite.api.Point; +import net.runelite.api.Text; import net.runelite.api.model.Triangle; import net.runelite.api.model.Vertex; import net.runelite.api.mixins.Inject; @@ -63,7 +64,7 @@ public abstract class RSPlayerMixin implements RSPlayer return null; } - return name.replace('\u00A0', ' '); + return Text.removeTags(name.replace('\u00A0', ' ')); } @Inject From 01f2532b1c141436b39c21a1d6d910c6d694db86 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Thu, 29 Mar 2018 23:12:17 +0200 Subject: [PATCH 6/8] Add DMM name drawing opcodes to cache Signed-off-by: Tomas Slusny --- .../main/java/net/runelite/cache/script/Instructions.java | 5 +++++ cache/src/main/java/net/runelite/cache/script/Opcodes.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/cache/src/main/java/net/runelite/cache/script/Instructions.java b/cache/src/main/java/net/runelite/cache/script/Instructions.java index 8cd59ace92..66a38474c7 100644 --- a/cache/src/main/java/net/runelite/cache/script/Instructions.java +++ b/cache/src/main/java/net/runelite/cache/script/Instructions.java @@ -300,6 +300,11 @@ public class Instructions add(ITEM_PRICE, "item_price", 1, 0); add(SEND_BUG_REPORT, "send_bug_report", 1, 0, 2, 0); add(SET_SHIFT_DROP_ENABLED, "set_shift_drop_enabled", 1, 0); + add(SET_DRAW_FRIEND_NAME, "set_draw_friend_name", 1, 0); + add(SET_DRAW_CLAN_NAME, "set_draw_clan_name", 1, 0); + add(SET_DRAW_ALL_EXCEPT_OWN_NAME, "set_draw_all_except_own_name", 1, 0); + add(SET_DRAW_OWN_NAME, "set_draw_own_name", 1, 0); + add(SET_DRAW_NO_NAMES, "set_draw_no_names", 1, 0); // 3200-3300 add(PLAY_SOUND_EFFECT, "play_sound_effect", 3, 0); add(3201, 1, 0); diff --git a/cache/src/main/java/net/runelite/cache/script/Opcodes.java b/cache/src/main/java/net/runelite/cache/script/Opcodes.java index b6c7a237f8..14de44ca58 100644 --- a/cache/src/main/java/net/runelite/cache/script/Opcodes.java +++ b/cache/src/main/java/net/runelite/cache/script/Opcodes.java @@ -238,6 +238,11 @@ public class Opcodes public static final int ITEM_PRICE = 3115; public static final int SEND_BUG_REPORT = 3116; public static final int SET_SHIFT_DROP_ENABLED = 3117; + public static final int SET_DRAW_FRIEND_NAME = 3120; + public static final int SET_DRAW_CLAN_NAME = 3121; + public static final int SET_DRAW_ALL_EXCEPT_OWN_NAME = 3122; + public static final int SET_DRAW_OWN_NAME = 3123; + public static final int SET_DRAW_NO_NAMES = 3124; public static final int PLAY_SOUND_EFFECT = 3200; public static final int GET_GAMECYCLE = 3300; public static final int GET_ITEMCONTAINER_ITEMID = 3301; From d268f9a75c270e288b151d1fd2dabb5cb33876b2 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sat, 31 Mar 2018 22:35:20 +0200 Subject: [PATCH 7/8] Add clan changed hook Add hook that will fire when user changed his clan. Signed-off-by: Tomas Slusny --- .../net/runelite/api/events/ClanChanged.java | 33 +++++++++++++++++++ .../net/runelite/mixins/RSClientMixin.java | 8 +++++ 2 files changed, 41 insertions(+) create mode 100644 runelite-api/src/main/java/net/runelite/api/events/ClanChanged.java diff --git a/runelite-api/src/main/java/net/runelite/api/events/ClanChanged.java b/runelite-api/src/main/java/net/runelite/api/events/ClanChanged.java new file mode 100644 index 0000000000..0c6c48f202 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/ClanChanged.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * 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.api.events; + +import lombok.Value; + +@Value +public class ClanChanged +{ + private boolean joined; +} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 13867836fb..5ca195f05f 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -56,6 +56,7 @@ import net.runelite.api.Varbits; import net.runelite.api.WidgetNode; import net.runelite.api.coords.LocalPoint; import net.runelite.api.events.BoostedLevelChanged; +import net.runelite.api.events.ClanChanged; import net.runelite.api.events.DraggingWidgetChanged; import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameStateChanged; @@ -653,4 +654,11 @@ public abstract class RSClientMixin implements RSClient resizeableChanged.setResized(client.isResized()); eventBus.post(resizeableChanged); } + + @FieldHook("clanMemberManager") + @Inject + public static void clanMemberManagerChanged(int idx) + { + eventBus.post(new ClanChanged(client.getClanMemberManager() != null)); + } } From d98fe4cf2da82605910663cc089435259d49bd4b Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sat, 31 Mar 2018 22:35:40 +0200 Subject: [PATCH 8/8] Properly invalidate clan ranks and names - Invalidate clan ranks when player changes his clan - Invalidate player names when game state changes Signed-off-by: Tomas Slusny --- .../PlayerIndicatorsPlugin.java | 28 +++++--- .../PlayerIndicatorsService.java | 66 +++++++++---------- 2 files changed, 50 insertions(+), 44 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java index c044aa7940..a82b39ca87 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java @@ -33,6 +33,7 @@ import javax.inject.Inject; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; import net.runelite.api.GameState; +import net.runelite.api.events.ClanChanged; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.SetMessage; @@ -76,30 +77,41 @@ public class PlayerIndicatorsPlugin extends Plugin @Override protected void startUp() { - playerIndicatorsService.updateConfig(false); + playerIndicatorsService.invalidatePlayerNames(); + playerIndicatorsService.updateConfig(); } @Override protected void shutDown() { - playerIndicatorsService.updateConfig(true); + playerIndicatorsService.invalidatePlayerNames(); + playerIndicatorsService.invalidateClanRanksCache(); + client.setPlayerNameMask(0); } @Subscribe public void onConfigChanged(ConfigChanged event) { - if (event.getGroup().equals("playerindicators") - || event.getGroup().equals("runelite") - || event.getGroup().equals("minimap")) + if (event.getGroup().equals("playerindicators")) { - playerIndicatorsService.updateConfig(false); + playerIndicatorsService.invalidatePlayerNames(); + playerIndicatorsService.updateConfig(); } } @Subscribe - public void onGameStateChanged(GameStateChanged gameStateChanged) + public void onGameStateChanged(GameStateChanged event) { - playerIndicatorsService.updateConfig(false); + if (event.getGameState() == GameState.LOGGED_IN) + { + playerIndicatorsService.updateConfig(); + } + } + + @Subscribe + public void onClanChanged(ClanChanged event) + { + playerIndicatorsService.invalidateClanRanksCache(); } @Subscribe diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java index 833bf3757b..a9ac2555d8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsService.java @@ -100,14 +100,8 @@ public class PlayerIndicatorsService this.client = client; } - public void updateConfig(boolean reset) + public void invalidatePlayerNames() { - // Update mod icons - if (modIconsLength == 0 && client.getGameState().compareTo(GameState.LOGIN_SCREEN) >= 0) - { - loadClanChatIcons(); - } - // Reset player names for (Player player : client.getPlayers()) { @@ -117,36 +111,45 @@ public class PlayerIndicatorsService } } - // Reset clan rank cache - if (reset) + // Refresh chat box + client.refreshChat(); + } + + public void invalidateClanRanksCache() + { + // Invalidate clan cache + clanRanksCache.invalidateAll(); + } + + public void updateConfig() + { + // Update mod icons + if (modIconsLength == 0 && client.getGameState().compareTo(GameState.LOGGED_IN) >= 0) { - clanRanksCache.invalidateAll(); + loadClanChatIcons(); } // Update mask int baseMask = 0; - if (!reset) + if (config.drawFriendNames()) { - if (config.drawFriendNames()) - { - baseMask |= PlayerNameMask.DRAW_FRIEND_NAME; - } + baseMask |= PlayerNameMask.DRAW_FRIEND_NAME; + } - if (config.drawClanMemberNames()) - { - baseMask |= PlayerNameMask.DRAW_CLAN_NAME; - } + if (config.drawClanMemberNames()) + { + baseMask |= PlayerNameMask.DRAW_CLAN_NAME; + } - if (config.drawOwnName()) - { - baseMask |= PlayerNameMask.DRAW_OWN_NAME; - } + if (config.drawOwnName()) + { + baseMask |= PlayerNameMask.DRAW_OWN_NAME; + } - if (config.drawNonOwnNames()) - { - baseMask |= PlayerNameMask.DRAW_ALL_EXCEPT_OWN_NAME; - } + if (config.drawNonOwnNames()) + { + baseMask |= PlayerNameMask.DRAW_ALL_EXCEPT_OWN_NAME; } client.setPlayerNameMask(baseMask); @@ -160,15 +163,6 @@ public class PlayerIndicatorsService public void forEachPlayer(final BiConsumer consumer) { - if (!config.drawOwnName() - && !config.drawClanMemberNames() - && !config.drawFriendNames() - && !config.drawNonOwnNames() - && !config.drawTeamMemberNames()) - { - return; - } - final Player localPlayer = client.getLocalPlayer(); for (Player player : client.getPlayers())