diff --git a/runelite-client/src/main/java/net/runelite/client/RuntimeConfig.java b/runelite-client/src/main/java/net/runelite/client/RuntimeConfig.java index fc7fdb4492..fe5f0e733d 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuntimeConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/RuntimeConfig.java @@ -27,6 +27,7 @@ package net.runelite.client; import com.google.common.base.Strings; import java.util.Collections; import java.util.Map; +import java.util.Set; import javax.swing.SwingUtilities; import lombok.Data; import net.runelite.client.ui.FatalErrorDialog; @@ -41,6 +42,8 @@ public class RuntimeConfig private String outageMessage; private Map outageLinks; + private Set ignoreDeadNpcs; + public boolean showOutageMessage() { if (Strings.isNullOrEmpty(getOutageMessage())) diff --git a/runelite-client/src/main/java/net/runelite/client/game/NpcUtil.java b/runelite-client/src/main/java/net/runelite/client/game/NpcUtil.java index b3d6aa54a2..a34c0abf1c 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/NpcUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/game/NpcUtil.java @@ -25,11 +25,22 @@ */ package net.runelite.client.game; +import java.util.Set; +import javax.inject.Inject; import net.runelite.api.NPC; import net.runelite.api.NpcID; +import net.runelite.client.RuntimeConfig; public class NpcUtil { + private final RuntimeConfig runtimeConfig; + + @Inject + private NpcUtil(RuntimeConfig runtimeConfig) + { + this.runtimeConfig = runtimeConfig; + } + /** * Returns whether an NPC is dying and can no longer be interacted with, or if it is still alive or in some special * state where it can be 0hp without dying. (For example, Gargoyles and other slayer monsters with item weaknesses @@ -38,7 +49,7 @@ public class NpcUtil * @param npc NPC to check whether it is dying * @return {@code true} if the NPC is dying */ - public static boolean isDying(final NPC npc) + public boolean isDying(final NPC npc) { final int id = npc.getId(); switch (id) @@ -79,6 +90,12 @@ public class NpcUtil case NpcID.KALPHITE_QUEEN_963: // KQ's first form sometimes regenerates 1hp after reaching 0hp, thus not dying return false; default: + Set ignoredNpcs = runtimeConfig.getIgnoreDeadNpcs(); + if (ignoredNpcs != null && ignoredNpcs.contains(id)) + { + return false; + } + return npc.isDead(); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java index a3932376e3..50232a82a2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/entityhider/EntityHiderPlugin.java @@ -59,6 +59,9 @@ public class EntityHiderPlugin extends Plugin @Inject private Hooks hooks; + @Inject + private NpcUtil npcUtil; + private boolean hideOthers; private boolean hideOthers2D; private boolean hideFriends; @@ -191,7 +194,7 @@ public class EntityHiderPlugin extends Plugin } // dead npcs can also be interacting so prioritize it over the interacting check - if (NpcUtil.isDying(npc) && hideDeadNpcs) + if (npcUtil.isDying(npc) && hideDeadNpcs) { return false; } 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 3c11c50207..b7b3488d1c 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 @@ -191,6 +191,9 @@ public class MenuEntrySwapperPlugin extends Plugin @Inject private ChatMessageManager chatMessageManager; + @Inject + private NpcUtil npcUtil; + private boolean configuringShiftClick = false; private boolean configuringLeftClick = false; @@ -1275,7 +1278,7 @@ public class MenuEntrySwapperPlugin extends Plugin .filter(e -> { final NPC npc = e.getNpc(); - return npc == null || !NpcUtil.isDying(npc); + return npc == null || !npcUtil.isDying(npc); }) .toArray(MenuEntry[]::new); if (oldEntries.length != newEntries.length) diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java index 3166552b6a..4cce2034fc 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java @@ -48,6 +48,7 @@ import java.util.Set; import net.runelite.api.Client; import net.runelite.client.RuneLite; import net.runelite.client.RuneLiteModule; +import net.runelite.client.RuntimeConfig; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigItem; import net.runelite.client.eventbus.EventBus; @@ -93,7 +94,7 @@ public class PluginManagerTest .thenThrow(new RuntimeException("in plugin manager test")); Injector injector = Guice.createInjector(Modules - .override(new RuneLiteModule(okHttpClient, () -> null, () -> null, true, false, + .override(new RuneLiteModule(okHttpClient, () -> null, () -> mock(RuntimeConfig.class), true, false, RuneLite.DEFAULT_SESSION_FILE, RuneLite.DEFAULT_CONFIG_FILE)) .with(BoundFieldModule.of(this)));