From 70916be1645d60b3652e74ec8100525d630eb538 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Tue, 27 Feb 2018 12:38:27 +0100 Subject: [PATCH 1/2] Remove animation checks Remove animation checks from hunter plugin because animations are unreliable and do not work during 3ticking. Reasoning is it is better to have shown extra traps sometimes than not registering own traps sometimes Signed-off-by: Tomas Slusny --- .../client/plugins/hunter/HunterPlugin.java | 125 ++++++++---------- 1 file changed, 54 insertions(+), 71 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java index 5849502a75..1c49c8bf8b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java @@ -36,7 +36,6 @@ import java.util.Set; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import net.runelite.api.AnimationID; import net.runelite.api.Client; import net.runelite.api.GameObject; import net.runelite.api.ObjectID; @@ -117,9 +116,9 @@ public class HunterPlugin extends Plugin @Subscribe public void onGameObjectSpawned(GameObjectSpawned event) { - GameObject gameObject = event.getGameObject(); - HunterTrap myTrap = getTrapFromCollection(gameObject); - Player localPlayer = client.getLocalPlayer(); + final GameObject gameObject = event.getGameObject(); + final HunterTrap myTrap = getTrapFromCollection(gameObject); + final Player localPlayer = client.getLocalPlayer(); switch (gameObject.getId()) { @@ -128,54 +127,36 @@ public class HunterPlugin extends Plugin * Placing traps * ------------------------------------------------------------------------------ */ - case ObjectID.DEADFALL: //Deadfall trap placed - if (localPlayer.getWorldLocation().distanceTo(gameObject.getWorldLocation()) <= 2 - && localPlayer.getAnimation() == AnimationID.HUNTER_LAY_DEADFALLTRAP) - { - log.debug("Deadfall trap placed by \"{}\" on {}", localPlayer.getName(), gameObject.getWorldLocation()); - traps.add(new HunterTrap(gameObject)); - lastActionTime = Instant.now(); - } - break; + case ObjectID.DEADFALL: // Deadfall trap placed case ObjectID.MONKEY_TRAP: // Maniacal monkey trap placed - if (localPlayer.getWorldLocation().distanceTo(gameObject.getWorldLocation()) < 2) + // If player is right next to "object" trap assume that player placed the trap + if (localPlayer.getWorldLocation().distanceTo(gameObject.getWorldLocation()) <= 1) { - log.debug("Maniacal monkey trap placed by \"{}\" on {} of {}", localPlayer.getName(), - gameObject.getWorldLocation(), gameObject); + log.debug("Trap placed by \"{}\" on {}", localPlayer.getName(), gameObject.getWorldLocation()); traps.add(new HunterTrap(gameObject)); lastActionTime = Instant.now(); } + break; case ObjectID.MAGIC_BOX: // Imp box placed - case ObjectID.BOX_TRAP_9380: //Box trap placed - case ObjectID.BIRD_SNARE_9345: //Bird snare placed - case ObjectID.NET_TRAP_9343: //Net trap placed at green sallys - case ObjectID.NET_TRAP: //Net trap placed at orange sallys - case ObjectID.NET_TRAP_8992: //Net trap placed at red sallys - case ObjectID.NET_TRAP_9002: //Net trap placed at black sallys - //Look for players that are on the same tile - PlayerQuery playerQuery = new PlayerQuery().atLocalLocation(gameObject.getLocalLocation()); - List possiblePlayers = Arrays.asList(queryRunner.runQuery(playerQuery)); + case ObjectID.BOX_TRAP_9380: // Box trap placed + case ObjectID.BIRD_SNARE_9345: // Bird snare placed + case ObjectID.NET_TRAP_9343: // Net trap placed at green sallys + case ObjectID.NET_TRAP: // Net trap placed at orange sallys + case ObjectID.NET_TRAP_8992: // Net trap placed at red sallys + case ObjectID.NET_TRAP_9002: // Net trap placed at black sallys + // Look for players that are on the same tile + final PlayerQuery playerQuery = new PlayerQuery().atLocalLocation(gameObject.getLocalLocation()); + final List possiblePlayers = Arrays.asList(queryRunner.runQuery(playerQuery)); - /* If the player is on that tile, and it has the correct animation, assume he is the one that placed the trap - * Special case: if you herb+tar, then move and place the trap, it does not detect laying the trap. It does work - * if you herb+tar en then place the trap. - */ + // If the player is on that tile, assume he is the one that placed the trap if (possiblePlayers.contains(localPlayer)) { - switch (localPlayer.getAnimation()) - { - case AnimationID.HUNTER_LAY_BOXTRAP_BIRDSNARE: - case AnimationID.HUNTER_LAY_NETTRAP: - case AnimationID.HERBLORE_MAKE_TAR: // When 3 ticking - log.debug("Trap placed by \"{}\" on {}", localPlayer.getName(), localPlayer.getWorldLocation()); - traps.add(new HunterTrap(gameObject)); - - lastActionTime = Instant.now(); - break; - } - + log.debug("Trap placed by \"{}\" on {}", localPlayer.getName(), localPlayer.getWorldLocation()); + traps.add(new HunterTrap(gameObject)); + lastActionTime = Instant.now(); } + break; /* * ------------------------------------------------------------------------------ @@ -183,27 +164,26 @@ public class HunterPlugin extends Plugin * ------------------------------------------------------------------------------ */ case ObjectID.MAGIC_BOX_19226: // Imp caught - case ObjectID.SHAKING_BOX: //Black chinchompa caught + case ObjectID.SHAKING_BOX: // Black chinchompa caught case ObjectID.SHAKING_BOX_9382: // Grey chinchompa caught - case ObjectID.SHAKING_BOX_9383: //Red chinchompa caught - case ObjectID.BOULDER_20648: //Prickly kebbit caught - case ObjectID.BOULDER_20649: //Sabre-tooth kebbit caught - case ObjectID.BOULDER_20650: //Barb-tailed kebbit caught - case ObjectID.BOULDER_20651: //Wild kebbit caught - case ObjectID.BIRD_SNARE_9373: //Crimson swift caught - case ObjectID.BIRD_SNARE_9375: //Cerulean twitch caught - case ObjectID.BIRD_SNARE_9377: //Golden warbler caught - case ObjectID.BIRD_SNARE_9379: //Copper longtail caught - case ObjectID.BIRD_SNARE_9348: //Tropical wagtail caught - case ObjectID.NET_TRAP_9004: //Green sally caught - case ObjectID.NET_TRAP_8986: //Red sally caught - case ObjectID.NET_TRAP_8734: //Orange sally caught - case ObjectID.NET_TRAP_8996: //Black sally caught + case ObjectID.SHAKING_BOX_9383: // Red chinchompa caught + case ObjectID.BOULDER_20648: // Prickly kebbit caught + case ObjectID.BOULDER_20649: // Sabre-tooth kebbit caught + case ObjectID.BOULDER_20650: // Barb-tailed kebbit caught + case ObjectID.BOULDER_20651: // Wild kebbit caught + case ObjectID.BIRD_SNARE_9373: // Crimson swift caught + case ObjectID.BIRD_SNARE_9375: // Cerulean twitch caught + case ObjectID.BIRD_SNARE_9377: // Golden warbler caught + case ObjectID.BIRD_SNARE_9379: // Copper longtail caught + case ObjectID.BIRD_SNARE_9348: // Tropical wagtail caught + case ObjectID.NET_TRAP_9004: // Green sally caught + case ObjectID.NET_TRAP_8986: // Red sally caught + case ObjectID.NET_TRAP_8734: // Orange sally caught + case ObjectID.NET_TRAP_8996: // Black sally caught case ObjectID.LARGE_BOULDER_28830: // Maniacal monkey tail obtained case ObjectID.LARGE_BOULDER_28831: // Maniacal monkey tail obtained if (myTrap != null) { - log.debug("Yay, you caught something"); myTrap.setState(HunterTrap.State.FULL); catchAtempts++; catchSuccess++; @@ -214,6 +194,7 @@ public class HunterPlugin extends Plugin notifier.notify("You've caught part of a monkey's tail."); } } + break; /* * ------------------------------------------------------------------------------ @@ -225,13 +206,13 @@ public class HunterPlugin extends Plugin case ObjectID.BIRD_SNARE: //Empty box trap if (myTrap != null) { - log.debug("Your trap didn't catch anything"); myTrap.setState(HunterTrap.State.EMPTY); myTrap.resetTimer(); catchAtempts++; lastActionTime = Instant.now(); } + break; /* * ------------------------------------------------------------------------------ @@ -241,25 +222,25 @@ public class HunterPlugin extends Plugin // Imp entering box case ObjectID.MAGIC_BOX_19225: - //Black chin shaking box + // Black chin shaking box case ObjectID.BOX_TRAP: case ObjectID.BOX_TRAP_2026: case ObjectID.BOX_TRAP_2028: case ObjectID.BOX_TRAP_2029: - //Red chin shaking box + // Red chin shaking box case ObjectID.BOX_TRAP_9381: case ObjectID.BOX_TRAP_9390: case ObjectID.BOX_TRAP_9391: case ObjectID.BOX_TRAP_9392: case ObjectID.BOX_TRAP_9393: - //Grey chin shaking box + // Grey chin shaking box case ObjectID.BOX_TRAP_9386: case ObjectID.BOX_TRAP_9387: case ObjectID.BOX_TRAP_9388: - //Bird traps + // Bird traps case ObjectID.BIRD_SNARE_9346: case ObjectID.BIRD_SNARE_9347: case ObjectID.BIRD_SNARE_9349: @@ -267,7 +248,7 @@ public class HunterPlugin extends Plugin case ObjectID.BIRD_SNARE_9376: case ObjectID.BIRD_SNARE_9378: - //Deadfall trap + // Deadfall trap case ObjectID.DEADFALL_19218: case ObjectID.DEADFALL_19851: case ObjectID.DEADFALL_20128: @@ -275,7 +256,7 @@ public class HunterPlugin extends Plugin case ObjectID.DEADFALL_20130: case ObjectID.DEADFALL_20131: - //Net trap + // Net trap case ObjectID.NET_TRAP_9003: case ObjectID.NET_TRAP_9005: case ObjectID.NET_TRAP_8972: @@ -304,23 +285,23 @@ public class HunterPlugin extends Plugin @Subscribe public void onGameTick(GameTick event) { - //Check if all traps are still there, and remove the ones that are not. - //TODO: use despawn events + // Check if all traps are still there, and remove the ones that are not. + // TODO: use despawn events Iterator it = traps.iterator(); while (it.hasNext()) { HunterTrap trap = it.next(); - //Look for gameobjects that are on the same location as the trap + // Look for gameobjects that are on the same location as the trap GameObjectQuery goQuery = new GameObjectQuery() .atWorldLocation(trap.getGameObject().getWorldLocation()); - //This is for placeable traps like box traps. There are no gameobjects on that location if the trap collapsed + // This is for placeable traps like box traps. There are no gameobjects on that location if the trap collapsed if (queryRunner.runQuery(goQuery).length == 0) { it.remove(); log.debug("Trap removed from personal trap collection, {} left", traps.size()); } - else //For traps like deadfalls. This is different because when the trap is gone, there is still a GameObject (boulder) + else // For traps like deadfalls. This is different because when the trap is gone, there is still a GameObject (boulder) { goQuery = goQuery.idEquals(ObjectID.BOULDER_19215, ObjectID.LARGE_BOULDER); if (queryRunner.runQuery(goQuery).length != 0) @@ -353,13 +334,14 @@ public class HunterPlugin extends Plugin * Looks for a trap in the local players trap collection, on the same * place as the given GameObject. * - * @param gameObject + * @param gameObject game object * @return A HunterTrap object if the player has a trap on the same * location as the GameObject. Otherwise it returns null. */ private HunterTrap getTrapFromCollection(GameObject gameObject) { - Point gameObjectLocation = gameObject.getWorldLocation(); + final Point gameObjectLocation = gameObject.getWorldLocation(); + for (HunterTrap trap : traps) { if (gameObjectLocation.equals(trap.getGameObject().getWorldLocation())) @@ -367,6 +349,7 @@ public class HunterPlugin extends Plugin return trap; } } + return null; } From 76fbab60fc742c95c526ce0cb8a371f8d5d65369 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Wed, 28 Feb 2018 10:27:13 +0100 Subject: [PATCH 2/2] Remove catch rate overlay Remove catch rate overlay because the catch attemps do not always need to be correct, because sometimes it might count other player's trap. Also, it works only for imps, boxes and bird snares otherwise it always shows 100%. Signed-off-by: Tomas Slusny --- .../plugins/hunter/CatchrateOverlay.java | 72 ------------------- .../client/plugins/hunter/HunterPlugin.java | 39 ++-------- 2 files changed, 4 insertions(+), 107 deletions(-) delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/hunter/CatchrateOverlay.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/CatchrateOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/CatchrateOverlay.java deleted file mode 100644 index cdf8469a1a..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/CatchrateOverlay.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2017, Robin Weymans - * 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.plugins.hunter; - -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Point; -import java.time.Duration; -import java.time.Instant; -import javax.inject.Inject; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.PanelComponent; - -/** - * Represents the overlay that shows the catch rate (percentage). - */ -public class CatchrateOverlay extends Overlay -{ - /** - * The time after which the catch rate panel disappears, if the player - * stops hunting. - */ - private final Duration catchRatePanelTimeOut = Duration.ofSeconds(30); - private final PanelComponent catchRatePanel = new PanelComponent(); - - private final HunterPlugin plugin; - - @Inject - CatchrateOverlay(HunterPlugin plugin) - { - setPosition(OverlayPosition.BOTTOM_RIGHT); - this.plugin = plugin; - } - - @Override - public Dimension render(Graphics2D graphics, Point parent) - { - if (Duration.between(plugin.getLastActionTime(), Instant.now()).compareTo(catchRatePanelTimeOut) < 0) - { - final String attackStyleString = String.format("%.2f", plugin.getCatchRate() * 100) + " %"; - catchRatePanel.setTitle(attackStyleString); - catchRatePanel.setWidth(80); - return catchRatePanel.render(graphics, parent); - } - - return null; - } - -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java index 1c49c8bf8b..cfcb0146d9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java @@ -28,7 +28,6 @@ import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; import java.time.Instant; import java.util.Arrays; -import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -50,7 +49,6 @@ import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.util.QueryRunner; @Slf4j @@ -66,10 +64,8 @@ public class HunterPlugin extends Plugin private QueryRunner queryRunner; @Inject - private TrapOverlay trapOverlay; - - @Inject - private CatchrateOverlay catchrateOverlay; + @Getter + private TrapOverlay overlay; @Inject private Notifier notifier; @@ -80,9 +76,6 @@ public class HunterPlugin extends Plugin @Getter private final Set traps = new HashSet<>(); - private double catchAtempts = 0; - private double catchSuccess = 0; - @Getter private Instant lastActionTime = Instant.ofEpochMilli(0); @@ -92,23 +85,15 @@ public class HunterPlugin extends Plugin return configManager.getConfig(HunterConfig.class); } - @Override - public Collection getOverlays() - { - return Arrays.asList(trapOverlay, catchrateOverlay); - } - @Override protected void startUp() { - trapOverlay.updateConfig(); + overlay.updateConfig(); } @Override protected void shutDown() throws Exception { - catchAtempts = 0; - catchSuccess = 0; lastActionTime = Instant.ofEpochMilli(0); traps.clear(); } @@ -185,8 +170,6 @@ public class HunterPlugin extends Plugin if (myTrap != null) { myTrap.setState(HunterTrap.State.FULL); - catchAtempts++; - catchSuccess++; lastActionTime = Instant.now(); if (config.maniacalMonkeyNotify() && myTrap.getGameObject().getId() == ObjectID.MONKEY_TRAP) @@ -208,8 +191,6 @@ public class HunterPlugin extends Plugin { myTrap.setState(HunterTrap.State.EMPTY); myTrap.resetTimer(); - catchAtempts++; - lastActionTime = Instant.now(); } @@ -326,7 +307,7 @@ public class HunterPlugin extends Plugin { if (event.getGroup().equals("hunterplugin")) { - trapOverlay.updateConfig(); + overlay.updateConfig(); } } @@ -352,16 +333,4 @@ public class HunterPlugin extends Plugin return null; } - - /** - * Calculates the catch rate, i.e. the attempts to catch something - * compared to the times you succeed. - * - * @return Value between 0 (none) and 1 (all). - */ - public double getCatchRate() - { - return catchAtempts != 0 ? catchSuccess / catchAtempts : 0; - } - }