From d3162944fa986e723b5a23f3f2d9f129facea550 Mon Sep 17 00:00:00 2001 From: Kyle <48519776+xKylee@users.noreply.github.com> Date: Fri, 26 Feb 2021 12:05:23 +0000 Subject: [PATCH] project: add missing features (#2951) * client: add stuff client: add stuff * mixins * Update XpDropEvent.java * Update EntityHiderBridgeMixin.java * would help if I uploaded the right files would help if I uploaded the right files --- .../main/java/net/runelite/api/Client.java | 57 +++++++++ .../com/openosrs/client/game/XpDropEvent.java | 11 ++ .../friendschat/FriendsChatPlugin.java | 9 ++ .../mixins/EntityHiderBridgeMixin.java | 112 ++++++++++++++++++ .../net/runelite/mixins/EntityHiderMixin.java | 88 ++++++++++---- 5 files changed, 252 insertions(+), 25 deletions(-) create mode 100644 runelite-client/src/main/java/com/openosrs/client/game/XpDropEvent.java diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index d6d193c325..a7e39ffc5d 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -1637,6 +1637,63 @@ public interface Client extends GameEngine */ void setHideSpecificPlayers(List names); + /** + * Get the list of NPC indices that are currently hidden + * + * @return all of the current hidden NPC Indices + */ + List getHiddenNpcIndices(); + + /** + * If an NPC index is in this List then do not render it + * + * @param npcIndices the npc indices to hide + */ + void setHiddenNpcIndices(List npcIndices); + + /** + * Increments the counter for how many times this npc has been selected to be hidden on death + * + * @param name npc name + */ + void addHiddenNpcDeath(String name); + + /** + * Decrements the counter for how many times this npc has been selected to be hidden on death + * + * @param name npc name + */ + void removeHiddenNpcDeath(String name); + + /** + * Increments the counter for how many times this npc has been selected to be hidden + * + * @param name npc name + */ + void addHiddenNpcName(String name); + + /** + * Decrements the counter for how many times this npc has been selected to be hidden + * + * @param name npc name + */ + void removeHiddenNpcName(String name); + + /** + * Sets whether or not other players are hidden. + * + * @param state the new player hidden state + */ + void setPlayersHidden(boolean state); + + /** + * Sets whether 2D sprites (ie. overhead prayers, PK skull) related to + * the other players are hidden. + * + * @param state the new player 2D hidden state + */ + void setPlayersHidden2D(boolean state); + /** * Sets whether projectiles are hidden. * diff --git a/runelite-client/src/main/java/com/openosrs/client/game/XpDropEvent.java b/runelite-client/src/main/java/com/openosrs/client/game/XpDropEvent.java new file mode 100644 index 0000000000..10926db81f --- /dev/null +++ b/runelite-client/src/main/java/com/openosrs/client/game/XpDropEvent.java @@ -0,0 +1,11 @@ +package com.openosrs.client.game; + +import lombok.Data; +import net.runelite.api.Skill; + +@Data +public class XpDropEvent +{ + private Skill skill; + private int exp; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/friendschat/FriendsChatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/friendschat/FriendsChatPlugin.java index 6263518015..26e0c470c7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/friendschat/FriendsChatPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/friendschat/FriendsChatPlugin.java @@ -39,6 +39,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; import javax.inject.Inject; import net.runelite.api.ChatLineBuffer; import net.runelite.api.ChatMessageType; @@ -130,6 +131,14 @@ public class FriendsChatPlugin extends Plugin private int joinedTick; private boolean kickConfirmed = false; + + private static final CopyOnWriteArrayList clanMembers = new CopyOnWriteArrayList<>(); + + @SuppressWarnings("unchecked") + public static CopyOnWriteArrayList getClanMembers() + { + return (CopyOnWriteArrayList) clanMembers.clone(); + } @Provides FriendsChatConfig getConfig(ConfigManager configManager) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderBridgeMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderBridgeMixin.java index 54745afbf2..3238d1ef38 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderBridgeMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderBridgeMixin.java @@ -25,6 +25,9 @@ */ package net.runelite.mixins; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.rs.api.RSClient; @@ -38,6 +41,12 @@ public abstract class EntityHiderBridgeMixin implements RSClient @Inject public static boolean isHidingEntities; + @Inject + public static boolean hidePlayers; + + @Inject + public static boolean hidePlayers2D; + @Inject public static boolean hideOthers; @@ -77,9 +86,21 @@ public abstract class EntityHiderBridgeMixin implements RSClient @Inject public static boolean hideDeadNPCs; + @Inject + public static Set blacklistDeadNpcs = new HashSet<>(); + @Inject public static List hideSpecificPlayers = new ArrayList<>(); + @Inject + public static HashMap hiddenNpcsDeath = new HashMap<>(); + + @Inject + public static HashMap hiddenNpcsName = new HashMap<>(); + + @Inject + public static List hiddenNpcIndices = new ArrayList<>(); + @Inject @Override public void setIsHidingEntities(boolean state) @@ -184,4 +205,95 @@ public abstract class EntityHiderBridgeMixin implements RSClient { hideDeadNPCs = state; } + + @Inject + @Override + public void addHiddenNpcDeath(String npc) + { + npc = npc.toLowerCase(); + int i = hiddenNpcsDeath.getOrDefault(npc, 0); + if (i == Integer.MAX_VALUE) + { + throw new RuntimeException("NPC death " + npc + " has been hidden Integer.MAX_VALUE times, is something wrong?"); + } + + hiddenNpcsDeath.put(npc, ++i); + } + + @Inject + @Override + public void removeHiddenNpcDeath(String npc) + { + npc = npc.toLowerCase(); + int i = hiddenNpcsDeath.getOrDefault(npc, 0); + if (i == 0) + { + return; + } + + hiddenNpcsDeath.put(npc, --i); + } + + @Inject + @Override + public void setBlacklistDeadNpcs(Set blacklist) + { + blacklistDeadNpcs = blacklist; + } + + @Inject + @Override + public void addHiddenNpcName(String npc) + { + npc = npc.toLowerCase(); + int i = hiddenNpcsName.getOrDefault(npc, 0); + if (i == Integer.MAX_VALUE) + { + throw new RuntimeException("NPC name " + npc + " has been hidden Integer.MAX_VALUE times, is something wrong?"); + } + + hiddenNpcsName.put(npc, ++i); + } + + @Inject + @Override + public void removeHiddenNpcName(String npc) + { + npc = npc.toLowerCase(); + int i = hiddenNpcsName.getOrDefault(npc, 0); + if (i == 0) + { + return; + } + + hiddenNpcsName.put(npc, --i); + } + + @Inject + @Override + public void setPlayersHidden(boolean state) + { + hidePlayers = state; + } + + @Inject + @Override + public void setPlayersHidden2D(boolean state) + { + hidePlayers2D = state; + } + + @Inject + @Override + public void setHiddenNpcIndices(List npcIndices) + { + hiddenNpcIndices = npcIndices; + } + + @Inject + @Override + public List getHiddenNpcIndices() + { + return hiddenNpcIndices; + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java index 6a07951e73..65ac82d094 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java @@ -25,7 +25,10 @@ */ package net.runelite.mixins; +import java.util.HashMap; +import java.util.Set; import net.runelite.api.mixins.*; +import net.runelite.api.util.Text; import net.runelite.rs.api.*; import java.util.List; @@ -39,6 +42,12 @@ public abstract class EntityHiderMixin implements RSScene @Shadow("isHidingEntities") private static boolean isHidingEntities; + @Shadow("hidePlayers") + private static boolean hidePlayers; + + @Shadow("hidePlayers2D") + private static boolean hidePlayers2D; + @Shadow("hideOthers") private static boolean hideOthers; @@ -63,9 +72,18 @@ public abstract class EntityHiderMixin implements RSScene @Shadow("hideNPCs") private static boolean hideNPCs; + @Shadow("hiddenNpcsName") + private static HashMap hiddenNpcsName; + + @Shadow("hiddenNpcsDeath") + private static HashMap hiddenNpcsDeath; + @Shadow("hideSpecificPlayers") private static List hideSpecificPlayers; + @Shadow("blacklistDeadNpcs") + private static Set blacklistDeadNpcs; + @Shadow("hideNPCs2D") private static boolean hideNPCs2D; @@ -81,6 +99,9 @@ public abstract class EntityHiderMixin implements RSScene @Shadow("hideDeadNPCs") private static boolean hideDeadNPCs; + @Shadow("hiddenNpcIndices") + private static List hiddenNpcIndices; + @Copy("newGameObject") @Replace("newGameObject") boolean copy$addEntityMarker(int var1, int var2, int var3, int var4, int var5, int x, int y, int var8, RSRenderable entity, int var10, boolean var11, long var12, int var13) @@ -122,17 +143,10 @@ public abstract class EntityHiderMixin implements RSScene if (entity instanceof RSPlayer) { + boolean local = drawingUI ? hideLocalPlayer2D : hideLocalPlayer; + boolean other = drawingUI ? hidePlayers2D : hidePlayers; + boolean isLocalPlayer = entity == client.getLocalPlayer(); RSPlayer player = (RSPlayer) entity; - RSPlayer local = client.getLocalPlayer(); - if (player.getName() == null) - { - return true; - } - - if (player == local) - { - return drawingUI ? !hideLocalPlayer2D : !hideLocalPlayer; - } for (String name : hideSpecificPlayers) { @@ -145,33 +159,37 @@ public abstract class EntityHiderMixin implements RSScene } } - if (hideAttackers && player.getInteracting() == local) + if (isLocalPlayer ? local : other) { - return false; - } + if (!hideAttackers) + { + if (player.getInteracting() == client.getLocalPlayer()) + { + return true; + } + } - if (player.isFriend()) - { - return !hideFriends; - } + if (player.getName() == null) + { + // player.isFriend() and player.isClanMember() npe when the player has a null name + return false; + } - if (player.isFriendsChatMember()) - { - return !hideClanMates; + return (!hideFriends && player.isFriend()) || + (!isLocalPlayer && !hideClanMates && player.isFriendsChatMember()); } - + if (client.getFriendManager().isIgnored(player.getRsName())) { return !hideIgnores; } - - return drawingUI ? !hideOthers2D : !hideOthers; + } else if (entity instanceof RSNPC) { RSNPC npc = (RSNPC) entity; - if (npc.isDead() && hideDeadNPCs) + if (npc.getInteracting() == client.getLocalPlayer() && hideAttackers) { return false; } @@ -181,11 +199,31 @@ public abstract class EntityHiderMixin implements RSScene return false; } - if (npc.getInteracting() == client.getLocalPlayer() && hideAttackers) + if (hideDeadNPCs && npc.getHealthRatio() == 0 && !blacklistDeadNpcs.contains(npc.getId())) { return false; } + if (npc.getName() != null && + hiddenNpcsName.getOrDefault(Text.standardize(npc.getName().toLowerCase()), 0) > 0) + { + return false; + } + + if (npc.getName() != null && npc.getHealthRatio() == 0 && + hiddenNpcsDeath.getOrDefault(Text.standardize(npc.getName().toLowerCase()), 0) > 0) + { + return false; + } + + for (Integer index : hiddenNpcIndices) + { + if (index != null && npc.getIndex() == index) + { + return false; + } + } + return drawingUI ? !hideNPCs2D : !hideNPCs; } else if (entity instanceof RSProjectile)