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 c06ed1ce49..6ea889b524 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 @@ -709,7 +709,7 @@ public class SlayerPlugin extends Plugin } } - private void onExperienceChanged(ExperienceChanged event) + void onExperienceChanged(ExperienceChanged event) { if (event.getSkill() != SLAYER) { @@ -725,23 +725,34 @@ public class SlayerPlugin extends Plugin if (cachedXp != 0) { - // this is not the initial xp sent on login so these are new xp gains - int gains = slayerExp - cachedXp; + final int taskKillExp = Task.getTask(taskName).getExpectedKillExp(); - // potential npcs to give xp drop are current highlighted npcs and the lingering presences - List potentialNPCs = new ArrayList<>(lingeringPresences); - for (NPC npc : highlightedTargets) - { - NPCPresence currentPresence = NPCPresence.buildPresence(npc); - potentialNPCs.add(currentPresence); - } - - int killCount = estimateKillCount(potentialNPCs, gains); - for (int i = 0; i < killCount; i++) + // Only count exp gain as a kill if the task either has no expected exp for a kill, or if the exp gain is equal + // to the expected exp gain for the task. + if (taskKillExp == 0 || taskKillExp == slayerExp - cachedXp) { killedOne(); - int delta = slayerExp - cachedXp; - currentTask.setElapsedXp(currentTask.getElapsedXp() + delta); + } + else + { + // this is not the initial xp sent on login so these are new xp gains + int gains = slayerExp - cachedXp; + + // potential npcs to give xp drop are current highlighted npcs and the lingering presences + List potentialNPCs = new ArrayList<>(lingeringPresences); + for (NPC npc : highlightedTargets) + { + NPCPresence currentPresence = NPCPresence.buildPresence(npc); + potentialNPCs.add(currentPresence); + } + + int killCount = estimateKillCount(potentialNPCs, gains); + for (int i = 0; i < killCount; i++) + { + killedOne(); + int delta = slayerExp - cachedXp; + currentTask.setElapsedXp(currentTask.getElapsedXp() + delta); + } } } cachedXp = slayerExp; @@ -815,7 +826,10 @@ public class SlayerPlugin extends Plugin config.amount(currentTask.getAmount()); // save changed value currentTask.setPaused(false); // no longer paused since xp is gained - panel.updateCurrentTask(true, currentTask.isPaused(), currentTask, false); + if (panel != null) + { + panel.updateCurrentTask(true, currentTask.isPaused(), currentTask, false); + } if (!this.showInfobox) { @@ -978,7 +992,7 @@ public class SlayerPlugin extends Plugin } } - private void setTask(String name, int amt, int initAmt, boolean isNewAssignment, int lastCertainAmt) + void setTask(String name, int amt, int initAmt, boolean isNewAssignment, int lastCertainAmt) { setTask(name, amt, initAmt, isNewAssignment, null, lastCertainAmt); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java index de867b0284..24c3a3f950 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java @@ -155,7 +155,7 @@ enum Task INFERNAL_MAGES("Infernal mages", ItemID.INFERNAL_MAGE, asList("Malevolent mage"), Collections.emptyList()), IRON_DRAGONS("Iron dragons", ItemID.IRON_DRAGON_MASK), - JAD("TzTok-Jad", ItemID.TZREKJAD), + JAD("TzTok-Jad", ItemID.TZREKJAD, 25250), JELLIES("Jellies", ItemID.JELLY, asList("Jelly"), Collections.emptyList()), JUNGLE_HORROR("Jungle horrors", ItemID.ENSOULED_HORROR_HEAD), @@ -237,7 +237,7 @@ enum Task ZOMBIES("Zombies", ItemID.ZOMBIE_HEAD, asList("Undead"), Collections.emptyList()), ZULRAH("Zulrah", ItemID.PET_SNAKELING), - ZUK("TzKal-Zuk", ItemID.TZREKZUK); + ZUK("TzKal-Zuk", ItemID.TZREKZUK, 101890); // private static final Map tasks; @@ -250,6 +250,7 @@ enum Task private final boolean checkAsTokens; private final int weaknessThreshold; private final int weaknessItem; + private final int expectedKillExp; static { @@ -273,6 +274,7 @@ enum Task this.targetNames = new ArrayList<>(); this.npcIds = new ArrayList<>(); this.checkAsTokens = true; + this.expectedKillExp = 0; } Task(String name, int itemSpriteId, int weaknessThreshold, int weaknessItem) @@ -285,6 +287,7 @@ enum Task this.targetNames = new ArrayList<>(); this.npcIds = new ArrayList<>(); this.checkAsTokens = true; + this.expectedKillExp = 0; } Task(String name, int itemSpriteId, boolean checkAsTokens) @@ -297,6 +300,20 @@ enum Task this.targetNames = new ArrayList<>(); this.npcIds = new ArrayList<>(); this.checkAsTokens = checkAsTokens; + this.expectedKillExp = 0; + } + + Task(String name, int itemSpriteId, int expectedKillExp) + { + Preconditions.checkArgument(itemSpriteId >= 0); + this.name = name; + this.itemSpriteId = itemSpriteId; + this.weaknessThreshold = -1; + this.weaknessItem = -1; + this.targetNames = new ArrayList<>(); + this.npcIds = new ArrayList<>(); + this.checkAsTokens = true; + this.expectedKillExp = expectedKillExp; } Task(String name, int itemSpriteId, List targetNames, List npcIds) @@ -309,6 +326,7 @@ enum Task this.targetNames = targetNames; this.npcIds = npcIds; this.checkAsTokens = true; + this.expectedKillExp = 0; } Task(String name, int itemSpriteId, List targetNames, List npcIds, int weaknessThreshold, int weaknessItem) @@ -321,6 +339,7 @@ enum Task this.targetNames = targetNames; this.npcIds = npcIds; this.checkAsTokens = true; + this.expectedKillExp = 0; } Task(String name, int itemSpriteId, List targetNames, List npcIds, boolean checkAsTokens) @@ -333,6 +352,7 @@ enum Task this.targetNames = targetNames; this.npcIds = npcIds; this.checkAsTokens = checkAsTokens; + this.expectedKillExp = 0; } static Task getTask(String taskName) diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java index 07cb08987b..2638636775 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java @@ -34,8 +34,10 @@ import net.runelite.api.ChatMessageType; import static net.runelite.api.ChatMessageType.GAMEMESSAGE; import net.runelite.api.Client; import net.runelite.api.MessageNode; +import net.runelite.api.Player; import net.runelite.api.Skill; import net.runelite.api.Varbits; +import net.runelite.api.coords.LocalPoint; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameTick; @@ -453,4 +455,60 @@ public class SlayerPluginTest assertEquals(name, name.toLowerCase()); } } + + @Test + public void testJadTaskKill() + { + final Player player = mock(Player.class); + when(player.getLocalLocation()).thenReturn(new LocalPoint(0, 0)); + when(client.getLocalPlayer()).thenReturn(player); + + final ExperienceChanged experienceChanged = new ExperienceChanged(); + experienceChanged.setSkill(Skill.SLAYER); + + when(client.getSkillExperience(Skill.SLAYER)).thenReturn(100); + slayerPlugin.onExperienceChanged(experienceChanged); + + slayerPlugin.setTask("TzTok-Jad", 1, 1, true, 0); + + // One bat kill + when(client.getSkillExperience(Skill.SLAYER)).thenReturn(110); + slayerPlugin.onExperienceChanged(experienceChanged); + + assertEquals(1, slayerPlugin.getCurrentTask().getAmount()); + + // One Jad kill + when(client.getSkillExperience(Skill.SLAYER)).thenReturn(25_360); + slayerPlugin.onExperienceChanged(experienceChanged); + + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); + } + + @Test + public void testZukTaskKill() + { + final Player player = mock(Player.class); + when(player.getLocalLocation()).thenReturn(new LocalPoint(0, 0)); + when(client.getLocalPlayer()).thenReturn(player); + + final ExperienceChanged experienceChanged = new ExperienceChanged(); + experienceChanged.setSkill(Skill.SLAYER); + + when(client.getSkillExperience(Skill.SLAYER)).thenReturn(100); + slayerPlugin.onExperienceChanged(experienceChanged); + + slayerPlugin.setTask("TzKal-Zuk", 1, 1, true, 0); + + // One bat kill + when(client.getSkillExperience(Skill.SLAYER)).thenReturn(125); + slayerPlugin.onExperienceChanged(experienceChanged); + + assertEquals(1, slayerPlugin.getCurrentTask().getAmount()); + + // One Zuk kill + when(client.getSkillExperience(Skill.SLAYER)).thenReturn(102_015); + slayerPlugin.onExperienceChanged(experienceChanged); + + assertEquals(0, slayerPlugin.getCurrentTask().getAmount()); + } }