From f975e0415d2b70e6843d57d010d6398f5aece409 Mon Sep 17 00:00:00 2001 From: Bart Peeters Date: Mon, 15 Jun 2020 00:25:14 -0700 Subject: [PATCH] driftnet: Improve fish shoal highlighting This commit increases the default highlight length for fish shoals as they are often active for much longer than 10 ticks, and also untags fish shoals more accurately when they are adjacent to nets which cannot catch fish. --- .../client/plugins/driftnet/DriftNet.java | 16 +++++++ .../plugins/driftnet/DriftNetConfig.java | 4 +- .../plugins/driftnet/DriftNetPlugin.java | 48 +++++++++++++++---- 3 files changed, 56 insertions(+), 12 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNet.java b/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNet.java index 8a5dfdfeeb..99dd0356e1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNet.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNet.java @@ -25,10 +25,13 @@ */ package net.runelite.client.plugins.driftnet; +import java.util.Set; import lombok.Data; import lombok.RequiredArgsConstructor; +import lombok.Setter; import net.runelite.api.GameObject; import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; @Data @RequiredArgsConstructor @@ -37,10 +40,23 @@ class DriftNet private final int objectId; private final Varbits statusVarbit; private final Varbits countVarbit; + private final Set adjacentTiles; private GameObject net; private DriftNetStatus status; private int count; + @Setter + private DriftNetStatus prevTickStatus; + + // Nets that are not accepting fish are those currently not accepting, or those which were not + // accepting in the previous tick. (When a fish shoal is 2 tiles adjacent to a drift net and is + // moving to a net that is just being setup it will be denied even though the net is currently + // in the CATCHING status) + boolean isNotAcceptingFish() + { + return (status != DriftNetStatus.CATCH && status != DriftNetStatus.SET) || + (prevTickStatus != DriftNetStatus.CATCH && prevTickStatus != DriftNetStatus.SET); + } String getFormattedCountText() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNetConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNetConfig.java index 4826768790..5ca1f29194 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNetConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNetConfig.java @@ -76,12 +76,12 @@ public interface DriftNetConfig extends Config ) @Range( min = 1, - max = 60 + max = 100 ) @Units(Units.TICKS) default int timeoutDelay() { - return 10; + return 60; } @ConfigItem( diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNetPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNetPlugin.java index 30449ad516..b7eecf2545 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNetPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNetPlugin.java @@ -26,12 +26,15 @@ package net.runelite.client.plugins.driftnet; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.inject.Provides; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import javax.inject.Inject; import lombok.Getter; import net.runelite.api.Actor; @@ -99,8 +102,19 @@ public class DriftNetPlugin extends Plugin private Map taggedFish = new HashMap<>(); @Getter private final List NETS = ImmutableList.of( - new DriftNet(NullObjectID.NULL_31433, Varbits.NORTH_NET_STATUS, Varbits.NORTH_NET_CATCH_COUNT), - new DriftNet(NullObjectID.NULL_31434, Varbits.SOUTH_NET_STATUS, Varbits.SOUTH_NET_CATCH_COUNT)); + new DriftNet(NullObjectID.NULL_31433, Varbits.NORTH_NET_STATUS, Varbits.NORTH_NET_CATCH_COUNT, ImmutableSet.of( + new WorldPoint(3746, 10297, 1), + new WorldPoint(3747, 10297, 1), + new WorldPoint(3748, 10297, 1), + new WorldPoint(3749, 10297, 1) + )), + new DriftNet(NullObjectID.NULL_31434, Varbits.SOUTH_NET_STATUS, Varbits.SOUTH_NET_CATCH_COUNT, ImmutableSet.of( + new WorldPoint(3742, 10288, 1), + new WorldPoint(3742, 10289, 1), + new WorldPoint(3742, 10290, 1), + new WorldPoint(3742, 10291, 1), + new WorldPoint(3742, 10292, 1) + ))); @Getter private boolean inDriftNetArea; @@ -190,12 +204,6 @@ public class DriftNetPlugin extends Plugin net.setStatus(status); net.setCount(count); } - - // When you collect any loot, all tags become invalidated - if (client.getVar(Varbits.DRIFT_NET_COLLECT) != 0) - { - taggedFish.clear(); - } } @Subscribe @@ -211,6 +219,17 @@ public class DriftNetPlugin extends Plugin } } + private boolean isFishNextToNet(NPC fish, Collection nets) + { + final WorldPoint fishTile = WorldPoint.fromLocalInstance(client, fish.getLocalLocation()); + return nets.stream().anyMatch(net -> net.getAdjacentTiles().contains(fishTile)); + } + + private boolean isTagExpired(Integer tick) + { + return tick + config.timeoutDelay() < client.getTickCount(); + } + @Subscribe public void onGameTick(GameTick tick) { @@ -219,8 +238,16 @@ public class DriftNetPlugin extends Plugin return; } - final int currentTickCount = client.getTickCount(); - taggedFish.entrySet().removeIf(entry -> entry.getValue() + config.timeoutDelay() < currentTickCount); + List closedNets = NETS.stream() + .filter(DriftNet::isNotAcceptingFish) + .collect(Collectors.toList()); + + taggedFish.entrySet().removeIf(entry -> + isTagExpired(entry.getValue()) || + isFishNextToNet(entry.getKey(), closedNets) + ); + + NETS.forEach(net -> net.setPrevTickStatus(net.getStatus())); armInteraction = false; } @@ -271,6 +298,7 @@ public class DriftNetPlugin extends Plugin { final NPC npc = event.getNpc(); fish.remove(npc); + taggedFish.remove(npc); } @Subscribe