From 34f18f56564c37f36220d5fd43d80754c976cd35 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 1 Apr 2018 14:20:27 -0400 Subject: [PATCH 1/9] Revert "Merge pull request #1154 from deathbeam/team-member-names" This reverts commit f0293087ce0a2e2dc515cfb57ef926c185d25cb5, reversing changes made to 309c1fde25d32086cfd242f988c8f45df903d66c. --- .../runelite/cache/script/Instructions.java | 5 - .../net/runelite/cache/script/Opcodes.java | 5 - .../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/api/events/ClanChanged.java | 33 --- .../plugins/clanchat/ClanChatPlugin.java | 258 ++++++++++++++++++ .../client/plugins/hiscore/HiscorePlugin.java | 3 +- .../MenuEntrySwapperPlugin.java | 2 +- .../nightmarezone/NightmareZonePlugin.java | 2 +- .../opponentinfo/OpponentInfoOverlay.java | 2 +- .../PlayerIndicatorsConfig.java | 51 +--- .../PlayerIndicatorsMinimapOverlay.java | 18 +- .../PlayerIndicatorsOverlay.java | 29 +- .../PlayerIndicatorsPlugin.java | 92 ------- .../PlayerIndicatorsService.java | 258 +----------------- .../client/plugins/raids/RaidsPlugin.java | 2 +- .../plugins/screenshot/ScreenshotPlugin.java | 2 +- .../client/plugins/slayer/SlayerPlugin.java | 2 +- .../java/net/runelite/client/util}/Text.java | 2 +- .../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 .../net/runelite/client/util/TextTest.java | 1 - .../net/runelite/mixins/RSClientMixin.java | 8 - .../net/runelite/mixins/RSPlayerMixin.java | 31 +-- .../java/net/runelite/rs/api/RSClient.java | 8 - .../main/java/net/runelite/rs/api/RSName.java | 6 - 33 files changed, 310 insertions(+), 551 deletions(-) delete mode 100644 runelite-api/src/main/java/net/runelite/api/PlayerNameMask.java delete mode 100644 runelite-api/src/main/java/net/runelite/api/events/ClanChanged.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java rename {runelite-api/src/main/java/net/runelite/api => runelite-client/src/main/java/net/runelite/client/util}/Text.java (98%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{playerindicators => clanchat}/Captain_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{playerindicators => clanchat}/Corporal_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{playerindicators => clanchat}/Friend_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{playerindicators => clanchat}/General_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{playerindicators => clanchat}/Lieutenant_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{playerindicators => clanchat}/Owner_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{playerindicators => clanchat}/Recruit_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/plugins/{playerindicators => clanchat}/Sergeant_clan_rank.png (100%) 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 66a38474c7..8cd59ace92 100644 --- a/cache/src/main/java/net/runelite/cache/script/Instructions.java +++ b/cache/src/main/java/net/runelite/cache/script/Instructions.java @@ -300,11 +300,6 @@ 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 14de44ca58..b6c7a237f8 100644 --- a/cache/src/main/java/net/runelite/cache/script/Opcodes.java +++ b/cache/src/main/java/net/runelite/cache/script/Opcodes.java @@ -238,11 +238,6 @@ 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; 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 c781270dc4..aeed397d4d 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -350,8 +350,4 @@ 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 0f7ec9f041..6ea285b3d1 100644 --- a/runelite-api/src/main/java/net/runelite/api/Player.java +++ b/runelite-api/src/main/java/net/runelite/api/Player.java @@ -31,10 +31,6 @@ 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 deleted file mode 100644 index a50a0a3276..0000000000 --- a/runelite-api/src/main/java/net/runelite/api/PlayerNameMask.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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-api/src/main/java/net/runelite/api/events/ClanChanged.java b/runelite-api/src/main/java/net/runelite/api/events/ClanChanged.java deleted file mode 100644 index 0c6c48f202..0000000000 --- a/runelite-api/src/main/java/net/runelite/api/events/ClanChanged.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java new file mode 100644 index 0000000000..1fc391d383 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java @@ -0,0 +1,258 @@ +/* + * 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/hiscore/HiscorePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java index 4eb97876c0..a6bdfd20e2 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,7 +32,6 @@ 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; @@ -139,7 +138,7 @@ public class HiscorePlugin extends Plugin throw new RuntimeException(e); } - hiscorePanel.lookup(Text.removeTags(event.getMenuTarget())); + hiscorePanel.lookup(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 0ac604ca26..9701049eb6 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,7 +37,6 @@ 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; @@ -53,6 +52,7 @@ 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 791f579f03..5c1f620132 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.api.Text; +import net.runelite.client.util.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 974a2282ef..1cf8df8c98 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.api.Text; +import net.runelite.client.util.Text; class OpponentInfoOverlay extends Overlay { 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 b6eef9d3f7..3475bc44af 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 Color.WHITE; + return new Color(0, 184, 212); } @ConfigItem( @@ -104,50 +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" + keyName = "drawNonClanMemberNames", + name = "Draw non-clan member names", + description = "Configures whether or not names of non-clan members should be drawn" ) - default boolean drawTeamMemberNames() + default boolean drawNonClanMemberNames() { return false; } @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 = "drawOthers", - name = "Draw names of others", - description = "Configures whether or not names of everyone except you should be drawn" - ) - default boolean drawNonOwnNames() - { - return false; - } - - @ConfigItem( - position = 9, keyName = "nonClanMemberColor", name = "Non-clan member color", description = "Color of non-clan member names" ) - default Color getNonOwnColor() + default Color getNonClanMemberColor() { - return Color.WHITE; + return Color.RED; } @ConfigItem( - position = 10, + position = 8, keyName = "drawPlayerTiles", name = "Draw tiles", description = "Configures whether or not tiles under players with rendered names should be drawn" @@ -158,7 +136,7 @@ public interface PlayerIndicatorsConfig extends Config } @ConfigItem( - position = 11, + position = 9, keyName = "drawMinimapNames", name = "Draw names on minimap", description = "Configures whether or not minimap names for players with rendered names should be drawn" @@ -167,15 +145,4 @@ 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 6112fa0112..266def094c 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 @@ -55,22 +55,22 @@ public class PlayerIndicatorsMinimapOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (config.drawMinimapNames()) - { - playerIndicatorsService.forEachPlayer((player, color) -> renderPlayerOverlay(graphics, player, color)); - } - + playerIndicatorsService.forEachPlayer((player, color) -> renderPlayerOverlay(graphics, player, color)); return null; } private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color) { - final String name = actor.getName(); - final net.runelite.api.Point minimapLocation = actor.getMinimapLocation(); + final String name = actor.getName().replace('\u00A0', ' '); - if (minimapLocation != null) + if (config.drawMinimapNames()) { - OverlayUtil.renderTextLocation(graphics, minimapLocation, name, color); + final net.runelite.api.Point minimapLocation = actor.getMinimapLocation(); + + if (minimapLocation != null) + { + OverlayUtil.renderTextLocation(graphics, minimapLocation, name, color); + } } } } 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 ec70c478a7..6dce1e04ff 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,7 +32,6 @@ 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; @@ -48,29 +47,35 @@ public class PlayerIndicatorsOverlay extends Overlay { this.config = config; this.playerIndicatorsService = playerIndicatorsService; - setLayer(OverlayLayer.ABOVE_SCENE); setPosition(OverlayPosition.DYNAMIC); - setPriority(OverlayPriority.LOW); + setPriority(OverlayPriority.HIGH); } @Override public Dimension render(Graphics2D graphics) { - if (config.drawTiles()) - { - playerIndicatorsService.forEachPlayer((player, color) -> renderPlayerOverlay(graphics, player, color)); - } - + playerIndicatorsService.forEachPlayer((player, color) -> renderPlayerOverlay(graphics, player, color)); return null; } private void renderPlayerOverlay(Graphics2D graphics, Player actor, Color color) { - Polygon poly = actor.getCanvasTilePoly(); - - if (poly != null) + if (config.drawTiles()) { - OverlayUtil.renderPolygon(graphics, poly, color); + Polygon poly = actor.getCanvasTilePoly(); + if (poly != null) + { + OverlayUtil.renderPolygon(graphics, poly, color); + } + } + + final String name = actor.getName().replace('\u00A0', ' '); + net.runelite.api.Point textLocation = actor + .getCanvasTextLocation(graphics, name, actor.getLogicalHeight() + 40); + + if (textLocation != null) + { + OverlayUtil.renderTextLocation(graphics, textLocation, 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 a82b39ca87..914eaf431d 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,24 +25,12 @@ 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.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; -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; -import net.runelite.client.task.Schedule; import net.runelite.client.ui.overlay.Overlay; @PluginDescriptor( @@ -50,18 +38,12 @@ import net.runelite.client.ui.overlay.Overlay; ) public class PlayerIndicatorsPlugin extends Plugin { - @Inject - private Client client; - @Inject private PlayerIndicatorsOverlay playerIndicatorsOverlay; @Inject private PlayerIndicatorsMinimapOverlay playerIndicatorsMinimapOverlay; - @Inject - private PlayerIndicatorsService playerIndicatorsService; - @Provides PlayerIndicatorsConfig provideConfig(ConfigManager configManager) { @@ -73,78 +55,4 @@ public class PlayerIndicatorsPlugin extends Plugin { return Sets.newHashSet(playerIndicatorsOverlay, playerIndicatorsMinimapOverlay); } - - @Override - protected void startUp() - { - playerIndicatorsService.invalidatePlayerNames(); - playerIndicatorsService.updateConfig(); - } - - @Override - protected void shutDown() - { - playerIndicatorsService.invalidatePlayerNames(); - playerIndicatorsService.invalidateClanRanksCache(); - client.setPlayerNameMask(0); - } - - @Subscribe - public void onConfigChanged(ConfigChanged event) - { - if (event.getGroup().equals("playerindicators")) - { - playerIndicatorsService.invalidatePlayerNames(); - playerIndicatorsService.updateConfig(); - } - } - - @Subscribe - public void onGameStateChanged(GameStateChanged event) - { - if (event.getGameState() == GameState.LOGGED_IN) - { - playerIndicatorsService.updateConfig(); - } - } - - @Subscribe - public void onClanChanged(ClanChanged event) - { - playerIndicatorsService.invalidateClanRanksCache(); - } - - @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 a9ac2555d8..b04c702444 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,74 +24,18 @@ */ 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.api.Text; @Singleton -@Slf4j public class PlayerIndicatorsService { - 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) @@ -100,70 +44,13 @@ public class PlayerIndicatorsService this.client = client; } - public void invalidatePlayerNames() - { - // Reset player names - for (Player player : client.getPlayers()) - { - if (player != null && player.getName() != null) - { - player.setName(player.getName()); - } - } - - // 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) - { - loadClanChatIcons(); - } - - // Update mask - int baseMask = 0; - - 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); - } - - public void updatePlayers() - { - // Update player names - forEachPlayer(this::injectData); - } - public void forEachPlayer(final BiConsumer consumer) { - final Player localPlayer = client.getLocalPlayer(); + if (!config.drawOwnName() && !config.drawClanMemberNames() + && !config.drawFriendNames() && !config.drawNonClanMemberNames()) + { + return; + } for (Player player : client.getPlayers()) { @@ -174,7 +61,7 @@ public class PlayerIndicatorsService boolean isClanMember = player.isClanMember(); - if (player == localPlayer) + if (player == client.getLocalPlayer()) { if (config.drawOwnName()) { @@ -189,139 +76,10 @@ public class PlayerIndicatorsService { consumer.accept(player, config.getClanMemberColor()); } - else if (config.drawTeamMemberNames() && localPlayer.getTeam() > 0 && localPlayer.getTeam() == player.getTeam()) + else if (config.drawNonClanMemberNames() && !isClanMember) { - consumer.accept(player, config.getTeamMemberColor()); - } - else if (config.drawNonOwnNames()) - { - consumer.accept(player, config.getNonOwnColor()); + consumer.accept(player, config.getNonClanMemberColor()); } } } - - 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 String playerName = player.getName(); - - if (config.showClanRankIcons() && player.isClanMember()) - { - final ClanMemberRank clanMemberRank = clanRanksCache.getUnchecked(playerName); - - if (clanMemberRank != ClanMemberRank.UNRANKED) - { - stringBuilder - .append(""); - } - } - - stringBuilder.append(""); - player.setName(stringBuilder.toString() + playerName); - } - - private static String parseColor(final Color color) - { - 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/java/net/runelite/client/plugins/raids/RaidsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java index c72b75935b..705e47631d 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.api.Text; +import net.runelite.client.util.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 0593afc1a2..f723f092b5 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.api.Text; +import net.runelite.client.util.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 329910d65d..60eb7c59bd 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.api.Text; +import net.runelite.client.util.Text; @PluginDescriptor( name = "Slayer" diff --git a/runelite-api/src/main/java/net/runelite/api/Text.java b/runelite-client/src/main/java/net/runelite/client/util/Text.java similarity index 98% rename from runelite-api/src/main/java/net/runelite/api/Text.java rename to runelite-client/src/main/java/net/runelite/client/util/Text.java index bcb058c1eb..6c6e71a7b7 100644 --- a/runelite-api/src/main/java/net/runelite/api/Text.java +++ b/runelite-client/src/main/java/net/runelite/client/util/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.api; +package net.runelite.client.util; /** * A set of utilities to use when dealing with text. diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Captain_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Captain_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Captain_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Captain_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Corporal_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Corporal_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Corporal_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Corporal_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Friend_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Friend_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Friend_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Friend_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/General_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/General_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/General_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/General_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Lieutenant_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Lieutenant_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Lieutenant_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Lieutenant_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Owner_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Owner_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Owner_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Owner_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Recruit_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Recruit_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Recruit_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Recruit_clan_rank.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Sergeant_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Sergeant_clan_rank.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/playerindicators/Sergeant_clan_rank.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/clanchat/Sergeant_clan_rank.png 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 c72653d730..b8c9fa9511 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,7 +24,6 @@ */ 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/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 5ca195f05f..13867836fb 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -56,7 +56,6 @@ 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; @@ -654,11 +653,4 @@ 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)); - } } 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 96c361269a..4981d760f5 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java @@ -30,7 +30,6 @@ 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; @@ -64,35 +63,7 @@ public abstract class RSPlayerMixin implements RSPlayer return null; } - return Text.removeTags(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); + return name.replace('\u00A0', ' '); } @Inject 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 f6340c4c85..57a5a661c6 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,12 +549,4 @@ 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 768edaab81..bbd4f9abfd 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,10 +30,4 @@ public interface RSName { @Import("name") String getName(); - - @Import("cleanName") - String getCleanName(); - - @Import("name") - void setName(String name); } From 65e3629f34ac94a35c651e3ad6848d5a55925390 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 1 Apr 2018 12:24:47 -0400 Subject: [PATCH 2/9] clanchat plugin: change cache to expire after write --- .../net/runelite/client/plugins/clanchat/ClanChatPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 1fc391d383..09d28c76f6 100644 --- 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 @@ -72,7 +72,7 @@ public class ClanChatPlugin extends Plugin private final LoadingCache clanRanksCache = CacheBuilder.newBuilder() .maximumSize(100) - .expireAfterAccess(1, TimeUnit.MINUTES) + .expireAfterWrite(1, TimeUnit.MINUTES) .build(new CacheLoader() { @Override From 185aa3f45b7b0e9df744e233f6b855d19efc8d4b Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sat, 31 Mar 2018 22:35:20 +0200 Subject: [PATCH 3/9] 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 2455b4f639706653d4baeeed0305beaca87783dd Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Tue, 27 Mar 2018 23:15:20 +0200 Subject: [PATCH 4/9] 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 | 8 +++++- 2 files changed, 32 insertions(+), 4 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..18a8a913e9 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) @@ -61,7 +63,7 @@ public class PlayerIndicatorsService boolean isClanMember = player.isClanMember(); - if (player == client.getLocalPlayer()) + if (player == localPlayer) { if (config.drawOwnName()) { @@ -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 c916b9cb344067f828c35cc95e0877382bd25e7a Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 1 Apr 2018 12:41:47 -0400 Subject: [PATCH 5/9] Add clan member manager to cache clanmember ranks, use in clanchat plugin --- .../java/net/runelite/client/RuneLite.java | 5 + .../net/runelite/client/game/ClanManager.java | 92 +++++++++++++++++++ .../plugins/clanchat/ClanChatPlugin.java | 50 +--------- 3 files changed, 102 insertions(+), 45 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/game/ClanManager.java diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index ba1a951baf..afd072ea69 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -43,6 +43,7 @@ import net.runelite.client.account.SessionManager; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ConfigManager; import net.runelite.client.discord.DiscordService; +import net.runelite.client.game.ClanManager; import net.runelite.client.game.ItemManager; import net.runelite.client.menus.MenuManager; import net.runelite.client.plugins.PluginManager; @@ -101,6 +102,9 @@ public class RuneLite @Inject private ItemManager itemManager; + @Inject + private ClanManager clanManager; + Client client; public static void main(String[] args) throws Exception @@ -161,6 +165,7 @@ public class RuneLite eventBus.register(chatMessageManager); eventBus.register(pluginManager); eventBus.register(itemManager); + eventBus.register(clanManager); // Load user configuration configManager.load(); diff --git a/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java b/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java new file mode 100644 index 0000000000..ceb49644c4 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018, Adam + * 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.game; + +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.util.Arrays; +import java.util.Objects; +import java.util.concurrent.TimeUnit; +import javax.inject.Inject; +import javax.inject.Provider; +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.events.ClanChanged; +import net.runelite.client.util.Text; + +@Singleton +@Slf4j +public class ClanManager +{ + @Inject + private Provider clientProvider; + + private final LoadingCache clanRanksCache = CacheBuilder.newBuilder() + .maximumSize(100) + .expireAfterWrite(1, TimeUnit.MINUTES) + .build(new CacheLoader() + { + @Override + public ClanMemberRank load(String key) throws Exception + { + final Client client = clientProvider.get(); + 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); + } + }); + + public ClanMemberRank getRank(String playerName) + { + return clanRanksCache.getUnchecked(playerName); + } + + @Subscribe + public void onClanChange(ClanChanged clanChanged) + { + clanRanksCache.invalidateAll(); + } + + private static String sanitize(String lookup) + { + final String cleaned = Text.removeTags(lookup); + return cleaned.replace('\u00A0', ' '); + } +} 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 index 09d28c76f6..804bf98dc1 100644 --- 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 @@ -24,9 +24,6 @@ */ 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; @@ -36,13 +33,10 @@ 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; @@ -51,6 +45,7 @@ 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.game.ClanManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.task.Schedule; @@ -69,36 +64,14 @@ public class ClanChatPlugin extends Plugin "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(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; + @Inject + private ClanManager clanManager; + @Override protected void startUp() throws Exception { @@ -108,12 +81,6 @@ public class ClanChatPlugin extends Plugin } } - @Override - protected void shutDown() - { - clanRanksCache.invalidateAll(); - } - @Subscribe public void onGameStateChanged(GameStateChanged gameStateChanged) { @@ -233,8 +200,7 @@ public class ClanChatPlugin extends Plugin private void insertClanRankIcon(final SetMessage message) { - final String playerName = sanitize(message.getName()); - final ClanMemberRank rank = clanRanksCache.getUnchecked(playerName); + final ClanMemberRank rank = clanManager.getRank(message.getName()); if (rank != null && rank != ClanMemberRank.UNRANKED) { @@ -249,10 +215,4 @@ public class ClanChatPlugin extends Plugin { return modIconsLength - CLANCHAT_IMAGES.length + clanMemberRank.getValue(); } - - private static String sanitize(String lookup) - { - final String cleaned = lookup.contains("') + 1) : lookup; - return cleaned.replace('\u00A0', ' '); - } } From 2b64f1b569b8c74b8716e161bfca41d4d9f5abbf Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 1 Apr 2018 12:50:59 -0400 Subject: [PATCH 6/9] Move clanmember icon logic to clanmanager --- .../net/runelite/client/game/ClanManager.java | 112 ++++++++++++++++ .../plugins/clanchat/ClanChatPlugin.java | 120 +----------------- .../clanchat => game}/Captain_clan_rank.png | Bin .../clanchat => game}/Corporal_clan_rank.png | Bin .../clanchat => game}/Friend_clan_rank.png | Bin .../clanchat => game}/General_clan_rank.png | Bin .../Lieutenant_clan_rank.png | Bin .../clanchat => game}/Owner_clan_rank.png | Bin .../clanchat => game}/Recruit_clan_rank.png | Bin .../clanchat => game}/Sergeant_clan_rank.png | Bin 10 files changed, 114 insertions(+), 118 deletions(-) rename runelite-client/src/main/resources/net/runelite/client/{plugins/clanchat => game}/Captain_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/{plugins/clanchat => game}/Corporal_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/{plugins/clanchat => game}/Friend_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/{plugins/clanchat => game}/General_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/{plugins/clanchat => game}/Lieutenant_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/{plugins/clanchat => game}/Owner_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/{plugins/clanchat => game}/Recruit_clan_rank.png (100%) rename runelite-client/src/main/resources/net/runelite/client/{plugins/clanchat => game}/Sergeant_clan_rank.png (100%) diff --git a/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java b/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java index ceb49644c4..55062db92e 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java @@ -28,9 +28,16 @@ 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.util.Arrays; import java.util.Objects; import java.util.concurrent.TimeUnit; +import javax.imageio.ImageIO; import javax.inject.Inject; import javax.inject.Provider; import javax.inject.Singleton; @@ -38,13 +45,26 @@ 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.events.ClanChanged; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.util.Text; @Singleton @Slf4j public class ClanManager { + 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 int modIconsLength; + @Inject private Provider clientProvider; @@ -78,15 +98,107 @@ public class ClanManager return clanRanksCache.getUnchecked(playerName); } + public int getIconNumber(final ClanMemberRank clanMemberRank) + { + return modIconsLength - CLANCHAT_IMAGES.length + clanMemberRank.getValue(); + } + + @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(); + } + } + @Subscribe public void onClanChange(ClanChanged clanChanged) { clanRanksCache.invalidateAll(); } + private void loadClanChatIcons() + { + try + { + final Client client = clientProvider.get(); + 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(client, resource); + newModIcons[curPosition++] = sprite; + } + + client.setModIcons(newModIcons); + modIconsLength = newModIcons.length; + } + catch (IOException e) + { + log.warn("Failed loading of clan chat icons", e); + } + } + private static String sanitize(String lookup) { final String cleaned = Text.removeTags(lookup); return cleaned.replace('\u00A0', ' '); } + + + private static IndexedSprite createIndexedSprite(final Client client, final String imagePath) throws IOException + { + final BufferedImage bufferedImage = rgbaToIndexedBufferedImage(ImageIO + .read(ClanManager.class.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; + } } 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 index 804bf98dc1..b7031212fc 100644 --- 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 @@ -25,23 +25,13 @@ package net.runelite.client.plugins.clanchat; 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 javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.ChatMessageType; 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; @@ -56,42 +46,12 @@ import net.runelite.client.task.Schedule; @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 int modIconsLength; - @Inject private Client client; @Inject private ClanManager clanManager; - @Override - protected void startUp() throws Exception - { - if (modIconsLength == 0 && client.getGameState().compareTo(GameState.LOGIN_SCREEN) >= 0) - { - loadClanChatIcons(); - } - } - - @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 @@ -124,79 +84,6 @@ public class ClanChatPlugin extends Plugin } } - 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) { @@ -204,15 +91,12 @@ public class ClanChatPlugin extends Plugin if (rank != null && rank != ClanMemberRank.UNRANKED) { - int iconNumber = getIconNumber(rank); + int iconNumber = clanManager.getIconNumber(rank); message.getMessageNode() .setSender(message.getMessageNode().getSender() + " "); client.refreshChat(); } } - 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/game/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/game/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/game/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/game/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/game/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/game/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/game/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/game/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/game/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/game/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/game/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/game/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/game/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/game/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/game/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/game/Sergeant_clan_rank.png From 74fd91d887670046a3a32599653b7ddee660aa53 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 1 Apr 2018 13:10:05 -0400 Subject: [PATCH 7/9] clanmanager: expose way to get bufferedimages for clan icons --- .../net/runelite/client/game/ClanManager.java | 46 +++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java b/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java index 55062db92e..d5210ebf45 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java @@ -65,8 +65,8 @@ public class ClanManager private int modIconsLength; - @Inject - private Provider clientProvider; + private final Provider clientProvider; + private final BufferedImage[] clanChatImages = new BufferedImage[CLANCHAT_IMAGES.length]; private final LoadingCache clanRanksCache = CacheBuilder.newBuilder() .maximumSize(100) @@ -93,11 +93,43 @@ public class ClanManager } }); + @Inject + public ClanManager(Provider clientProvider) + { + this.clientProvider = clientProvider; + + int i = 0; + for (String resource : CLANCHAT_IMAGES) + { + try + { + final BufferedImage bufferedImage = rgbaToIndexedBufferedImage(ImageIO + .read(ClanManager.class.getResource(resource))); + clanChatImages[i] = bufferedImage; + } + catch (IOException e) + { + log.warn("unable to load clan image", e); + } + + ++i; + } + } + public ClanMemberRank getRank(String playerName) { return clanRanksCache.getUnchecked(playerName); } + public BufferedImage getClanImage(final ClanMemberRank clanMemberRank) + { + if (clanMemberRank == ClanMemberRank.UNRANKED) + { + return null; + } + return clanChatImages[clanMemberRank.getValue()]; + } + public int getIconNumber(final ClanMemberRank clanMemberRank) { return modIconsLength - CLANCHAT_IMAGES.length + clanMemberRank.getValue(); @@ -129,9 +161,9 @@ public class ClanManager final IndexedSprite[] newModIcons = Arrays.copyOf(modIcons, modIcons.length + CLANCHAT_IMAGES.length); int curPosition = newModIcons.length - CLANCHAT_IMAGES.length; - for (String resource : CLANCHAT_IMAGES) + for (BufferedImage image : clanChatImages) { - IndexedSprite sprite = createIndexedSprite(client, resource); + IndexedSprite sprite = createIndexedSprite(client, image); newModIcons[curPosition++] = sprite; } @@ -150,12 +182,8 @@ public class ClanManager return cleaned.replace('\u00A0', ' '); } - - private static IndexedSprite createIndexedSprite(final Client client, final String imagePath) throws IOException + private static IndexedSprite createIndexedSprite(final Client client, final BufferedImage bufferedImage) throws IOException { - final BufferedImage bufferedImage = rgbaToIndexedBufferedImage(ImageIO - .read(ClanManager.class.getResource(imagePath))); - final IndexColorModel indexedCM = (IndexColorModel) bufferedImage.getColorModel(); final int width = bufferedImage.getWidth(); From c0bec73e5c3a6890fa0e0d984fb9d6ddb7d522c7 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 1 Apr 2018 13:10:31 -0400 Subject: [PATCH 8/9] player indicator overlay: render clan rank next to names --- .../PlayerIndicatorsOverlay.java | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) 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..b621ac81ff 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 @@ -28,9 +28,13 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; +import java.awt.image.BufferedImage; import javax.inject.Inject; import javax.inject.Singleton; +import net.runelite.api.ClanMemberRank; import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.client.game.ClanManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; @@ -41,12 +45,15 @@ public class PlayerIndicatorsOverlay extends Overlay { private final PlayerIndicatorsService playerIndicatorsService; private final PlayerIndicatorsConfig config; + private final ClanManager clanManager; @Inject - private PlayerIndicatorsOverlay(PlayerIndicatorsConfig config, PlayerIndicatorsService playerIndicatorsService) + private PlayerIndicatorsOverlay(PlayerIndicatorsConfig config, PlayerIndicatorsService playerIndicatorsService, + ClanManager clanManager) { this.config = config; this.playerIndicatorsService = playerIndicatorsService; + this.clanManager = clanManager; setPosition(OverlayPosition.DYNAMIC); setPriority(OverlayPriority.HIGH); } @@ -69,12 +76,29 @@ public class PlayerIndicatorsOverlay extends Overlay } } - final String name = actor.getName().replace('\u00A0', ' '); - net.runelite.api.Point textLocation = actor - .getCanvasTextLocation(graphics, name, actor.getLogicalHeight() + 40); + String name = actor.getName().replace('\u00A0', ' '); + int offset = actor.getLogicalHeight() + 40; + Point textLocation = actor.getCanvasTextLocation(graphics, name, offset); if (textLocation != null) { + if (actor.isClanMember()) + { + ClanMemberRank rank = clanManager.getRank(name); + if (rank != ClanMemberRank.UNRANKED) + { + BufferedImage clanchatImage = clanManager.getClanImage(rank); + if (clanchatImage != null) + { + int width = clanchatImage.getWidth(); + Point imageLocation = new Point(textLocation.getX() - width / 2, textLocation.getY() - clanchatImage.getHeight()); + OverlayUtil.renderImageLocation(graphics, imageLocation, clanchatImage); + + // move text + textLocation = new Point(textLocation.getX() + width / 2, textLocation.getY()); + } + } + } OverlayUtil.renderTextLocation(graphics, textLocation, name, color); } } From fac507c7e893058f409ae49f2d5eaeeece8361f8 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 1 Apr 2018 13:56:33 -0400 Subject: [PATCH 9/9] player indicators plugin: change color of menus --- .../main/java/net/runelite/api/Client.java | 2 + .../java/net/runelite/api/MenuAction.java | 3 + .../PlayerIndicatorsOverlay.java | 2 +- .../PlayerIndicatorsPlugin.java | 114 ++++++++++++++++++ .../java/net/runelite/rs/api/RSClient.java | 1 + 5 files changed, 121 insertions(+), 1 deletion(-) 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..39d2a6eab0 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -41,6 +41,8 @@ public interface Client extends GameEngine NPC[] getCachedNPCs(); + Player[] getCachedPlayers(); + int getBoostedSkillLevel(Skill skill); int getRealSkillLevel(Skill skill); diff --git a/runelite-api/src/main/java/net/runelite/api/MenuAction.java b/runelite-api/src/main/java/net/runelite/api/MenuAction.java index af71fb16c1..379df24212 100644 --- a/runelite-api/src/main/java/net/runelite/api/MenuAction.java +++ b/runelite-api/src/main/java/net/runelite/api/MenuAction.java @@ -254,6 +254,9 @@ public enum MenuAction * Menu action injected by runelite for its menu items. */ RUNELITE(1500), + + FOLLOW(2046), + TRADE(2047), /** * Menu action triggered when the id is not defined in this class. 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 b621ac81ff..00d8b88280 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 @@ -49,7 +49,7 @@ public class PlayerIndicatorsOverlay extends Overlay @Inject private PlayerIndicatorsOverlay(PlayerIndicatorsConfig config, PlayerIndicatorsService playerIndicatorsService, - ClanManager clanManager) + ClanManager clanManager) { this.config = config; this.playerIndicatorsService = playerIndicatorsService; 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..452b7f687b 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,10 +25,31 @@ 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.awt.Color; import java.util.Collection; import javax.inject.Inject; +import net.runelite.api.ClanMemberRank; +import static net.runelite.api.ClanMemberRank.UNRANKED; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.FOLLOW; +import static net.runelite.api.MenuAction.ITEM_USE_ON_PLAYER; +import static net.runelite.api.MenuAction.PLAYER_EIGTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FIFTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FIRST_OPTION; +import static net.runelite.api.MenuAction.PLAYER_FOURTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SECOND_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SEVENTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_SIXTH_OPTION; +import static net.runelite.api.MenuAction.PLAYER_THIRD_OPTION; +import static net.runelite.api.MenuAction.SPELL_CAST_ON_PLAYER; +import static net.runelite.api.MenuAction.TRADE; +import net.runelite.api.MenuEntry; +import net.runelite.api.Player; +import net.runelite.api.events.MenuEntryAdded; import net.runelite.client.config.ConfigManager; +import net.runelite.client.game.ClanManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.Overlay; @@ -38,12 +59,21 @@ import net.runelite.client.ui.overlay.Overlay; ) public class PlayerIndicatorsPlugin extends Plugin { + @Inject + private PlayerIndicatorsConfig config; + @Inject private PlayerIndicatorsOverlay playerIndicatorsOverlay; @Inject private PlayerIndicatorsMinimapOverlay playerIndicatorsMinimapOverlay; + @Inject + private Client client; + + @Inject + private ClanManager clanManager; + @Provides PlayerIndicatorsConfig provideConfig(ConfigManager configManager) { @@ -55,4 +85,88 @@ public class PlayerIndicatorsPlugin extends Plugin { return Sets.newHashSet(playerIndicatorsOverlay, playerIndicatorsMinimapOverlay); } + + @Subscribe + public void onMenuEntryAdd(MenuEntryAdded menuEntryAdded) + { + int type = menuEntryAdded.getType(); + int identifier = menuEntryAdded.getIdentifier(); + if (type == FOLLOW.getId() || type == TRADE.getId() + || type == SPELL_CAST_ON_PLAYER.getId() || type == ITEM_USE_ON_PLAYER.getId() + || type == PLAYER_FIRST_OPTION.getId() + || type == PLAYER_SECOND_OPTION.getId() + || type == PLAYER_THIRD_OPTION.getId() + || type == PLAYER_FOURTH_OPTION.getId() + || type == PLAYER_FIFTH_OPTION.getId() + || type == PLAYER_SIXTH_OPTION.getId() + || type == PLAYER_SEVENTH_OPTION.getId() + || type == PLAYER_EIGTH_OPTION.getId()) + { + final Player localPlayer = client.getLocalPlayer(); + Player[] players = client.getCachedPlayers(); + Player player = null; + + if (identifier >= 0 && identifier < players.length) + { + player = players[identifier]; + } + + if (player == null) + { + return; + } + + int image = -1; + Color color = null; + + if (config.drawFriendNames() && player.isFriend()) + { + color = config.getFriendNameColor(); + } + else if (config.drawClanMemberNames() && player.isClanMember()) + { + color = config.getClanMemberColor(); + + ClanMemberRank rank = clanManager.getRank(player.getName()); + if (rank != UNRANKED) + { + image = clanManager.getIconNumber(rank); + } + } + else if (config.drawTeamMemberNames() && player.getTeam() > 0 && localPlayer.getTeam() == player.getTeam()) + { + color = config.getTeamMemberColor(); + } + else if (config.drawNonClanMemberNames() && !player.isClanMember()) + { + color = config.getNonClanMemberColor(); + } + + if (image != -1 || color != null) + { + MenuEntry[] menuEntries = client.getMenuEntries(); + MenuEntry lastEntry = menuEntries[menuEntries.length - 1]; + + if (color != null) + { + // strip out existing '); + if (idx != -1) + { + target = target.substring(idx + 1); + } + + lastEntry.setTarget("" + target); + } + + if (image != -1) + { + lastEntry.setTarget("" + lastEntry.getTarget()); + } + + client.setMenuEntries(menuEntries); + } + } + } } 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..5f88ffce59 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 @@ -163,6 +163,7 @@ public interface RSClient extends RSGameEngine, Client int[] getPlayerIndices(); @Import("cachedPlayers") + @Override RSPlayer[] getCachedPlayers(); @Import("localInteractingIndex")