From 2a755eb7edf3438cd640b8f6121609f042e47e74 Mon Sep 17 00:00:00 2001 From: ThatGamerBlue Date: Fri, 26 Feb 2021 19:35:19 +0000 Subject: [PATCH] unrevert some stuff --- .../main/java/net/runelite/api/Client.java | 28 ++++++++ .../java/net/runelite/client/RuneLite.java | 7 ++ .../runelite/client/events/XpDropEvent.java | 35 ++++++++++ .../runelite/client/game/XpDropManager.java | 65 +++++++++++++++++++ runelite-mixins/runelite-mixins.gradle.kts | 4 +- .../mixins/EntityHiderBridgeMixin.java | 50 ++++++++++++++ .../net/runelite/mixins/EntityHiderMixin.java | 26 ++++++++ 7 files changed, 213 insertions(+), 2 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/events/XpDropEvent.java create mode 100644 runelite-client/src/main/java/net/runelite/client/game/XpDropManager.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..700f4e3d88 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,34 @@ 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 + * + * @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 projectiles are hidden. * 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 177861af22..3dbeea9ed3 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -66,6 +66,7 @@ import net.runelite.client.discord.DiscordService; import net.runelite.client.eventbus.EventBus; import net.runelite.client.externalplugins.ExternalPluginManager; import net.runelite.client.game.WorldService; +import net.runelite.client.game.XpDropManager; import net.runelite.client.plugins.OPRSExternalPluginManager; import net.runelite.client.rs.ClientLoader; import net.runelite.client.rs.ClientUpdateCheckMode; @@ -139,6 +140,9 @@ public class RuneLite @Inject private Provider worldMapOverlay; + @Inject + private Provider xpDropManager; + @Inject private WorldService worldService; @@ -382,6 +386,9 @@ public class RuneLite WidgetOverlay.createOverlays(client).forEach(overlayManager::add); overlayManager.add(worldMapOverlay.get()); overlayManager.add(tooltipOverlay.get()); + + // legacy method, i cant figure out how to make it work without garbage + eventBus.register(xpDropManager.get()); } // Start plugins diff --git a/runelite-client/src/main/java/net/runelite/client/events/XpDropEvent.java b/runelite-client/src/main/java/net/runelite/client/events/XpDropEvent.java new file mode 100644 index 0000000000..e0a700627a --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/events/XpDropEvent.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021, ThatGamerBlue + * 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.events; + +import lombok.Value; +import net.runelite.api.Skill; + +@Value +public class XpDropEvent +{ + Skill skill; + int exp; +} diff --git a/runelite-client/src/main/java/net/runelite/client/game/XpDropManager.java b/runelite-client/src/main/java/net/runelite/client/game/XpDropManager.java new file mode 100644 index 0000000000..1119456e37 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/game/XpDropManager.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2021, ThatGamerBlue + * 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 java.util.EnumMap; +import java.util.Map; +import javax.inject.Inject; +import javax.inject.Singleton; +import net.runelite.api.Client; +import net.runelite.api.Skill; +import net.runelite.api.events.StatChanged; +import net.runelite.client.eventbus.EventBus; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.XpDropEvent; + +@Singleton +public class XpDropManager +{ + private final Map previousSkillExpTable = new EnumMap<>(Skill.class); + private final Client client; + private final EventBus eventBus; + + @Inject + private XpDropManager(Client client, EventBus eventBus) + { + this.client = client; + this.eventBus = eventBus; + } + + @Subscribe + private void onStatChanged(StatChanged event) + { + final Skill skill = event.getSkill(); + final int xp = client.getSkillExperience(skill); + Integer previous = previousSkillExpTable.put(skill, xp); + if (previous != null) + { + int previousExpGained = xp - previous; + XpDropEvent xpDropEvent = new XpDropEvent(skill, previousExpGained); + eventBus.post(xpDropEvent); + } + } +} diff --git a/runelite-mixins/runelite-mixins.gradle.kts b/runelite-mixins/runelite-mixins.gradle.kts index c6227a67b6..f6416addc9 100644 --- a/runelite-mixins/runelite-mixins.gradle.kts +++ b/runelite-mixins/runelite-mixins.gradle.kts @@ -35,8 +35,8 @@ dependencies { tasks { java { - sourceCompatibility = JavaVersion.VERSION_1_7 - targetCompatibility = JavaVersion.VERSION_1_7 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 disableAutoTargetJvm() } withType { 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..394b9c01d7 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,8 @@ */ package net.runelite.mixins; +import java.util.HashMap; +import java.util.concurrent.CopyOnWriteArrayList; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.rs.api.RSClient; @@ -80,6 +82,12 @@ public abstract class EntityHiderBridgeMixin implements RSClient @Inject public static List hideSpecificPlayers = new ArrayList<>(); + @Inject + public static HashMap hiddenNpcsName = new HashMap<>(); + + @Inject + public static List hiddenNpcIndices = new ArrayList<>(); + @Inject @Override public void setIsHidingEntities(boolean state) @@ -184,4 +192,46 @@ public abstract class EntityHiderBridgeMixin implements RSClient { hideDeadNPCs = state; } + + @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 setHiddenNpcIndices(List npcIndices) + { + hiddenNpcIndices = new ArrayList<>(npcIndices); + } + + @Inject + @Override + public List getHiddenNpcIndices() + { + return new ArrayList<>(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..3fe8ceeaab 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/EntityHiderMixin.java @@ -25,6 +25,8 @@ */ package net.runelite.mixins; +import java.util.HashMap; +import java.util.Map; import net.runelite.api.mixins.*; import net.runelite.rs.api.*; @@ -81,6 +83,12 @@ public abstract class EntityHiderMixin implements RSScene @Shadow("hideDeadNPCs") private static boolean hideDeadNPCs; + @Shadow("hiddenNpcsName") + private static HashMap hiddenNpcsName; + + @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) @@ -171,6 +179,24 @@ public abstract class EntityHiderMixin implements RSScene { RSNPC npc = (RSNPC) entity; + if (hiddenNpcIndices.contains(npc.getIndex())) + { + return false; + } + + for (Map.Entry entry : hiddenNpcsName.entrySet()) + { + String name = entry.getKey(); + int count = entry.getValue(); + if (name != null && !name.equals("")) + { + if (count > 0 && npc.getName() != null && npc.getName().equalsIgnoreCase(name)) + { + return false; + } + } + } + if (npc.isDead() && hideDeadNPCs) { return false;