From 32c7b74b234fa0b2d519b43dd17bc4a7eaea6e8a Mon Sep 17 00:00:00 2001 From: Shaun Dreclin Date: Mon, 21 Jan 2019 17:17:05 -0500 Subject: [PATCH 01/21] Add Time to level to XP Globes tooltip --- .../runelite/client/plugins/xpglobes/XpGlobesOverlay.java | 7 +++++++ .../client/plugins/xptracker/XpTrackerService.java | 5 +++++ .../client/plugins/xptracker/XpTrackerServiceImpl.java | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java index 58a2faea17..7e5d049624 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java @@ -283,6 +283,13 @@ public class XpGlobesOverlay extends Overlay .right(xpHrString) .build()); } + + String timeLeft = xpTrackerService.getTimeTillGoal(mouseOverSkill.getSkill()); + xpTooltip.getChildren().add(LineComponent.builder() + .left("Time left:") + .leftColor(Color.ORANGE) + .right(timeLeft) + .build()); } xpTooltip.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerService.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerService.java index f423757528..9d8c248b50 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerService.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerService.java @@ -62,4 +62,9 @@ public interface XpTrackerService * Get the amount of XP left until goal level */ int getEndGoalXp(Skill skill); + + /** + * Get the amount of time left until goal level + */ + String getTimeTillGoal(Skill skill); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerServiceImpl.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerServiceImpl.java index 0968d14892..0c31b85ba2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerServiceImpl.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerServiceImpl.java @@ -80,4 +80,10 @@ class XpTrackerServiceImpl implements XpTrackerService { return plugin.getSkillSnapshot(skill).getEndGoalXp(); } + + @Override + public String getTimeTillGoal(Skill skill) + { + return plugin.getSkillSnapshot(skill).getTimeTillGoal(); + } } From f627c9224fcedbad1e62c07953c836feee1f318a Mon Sep 17 00:00:00 2001 From: Shaun Dreclin Date: Mon, 23 Jul 2018 13:07:35 -0400 Subject: [PATCH 02/21] client: Add Tarn's Lair plugin --- .../client/plugins/tarnslair/Obstacles.java | 131 ++++++++++++++ .../plugins/tarnslair/TarnsLairOverlay.java | 107 +++++++++++ .../plugins/tarnslair/TarnsLairPlugin.java | 171 ++++++++++++++++++ 3 files changed, 409 insertions(+) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/Obstacles.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairOverlay.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairPlugin.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/Obstacles.java b/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/Obstacles.java new file mode 100644 index 0000000000..b26823c4a8 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/Obstacles.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2018, Shaun Dreclin + * 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.tarnslair; + +import com.google.common.collect.Sets; +import java.util.Set; +import static net.runelite.api.NullObjectID.NULL_20575; +import static net.runelite.api.ObjectID.*; + +class Obstacles +{ + static final Set STAIRCASE_IDS = Sets.newHashSet( + PASSAGEWAY_15770, /*Wall staircase*/ + PASSAGEWAY_15771, /*Wall staircase*/ + PASSAGEWAY_15772, /*Wall staircase*/ + PASSAGEWAY_15773, /*Wall staircase*/ + PASSAGEWAY_15774, /*Wall staircase*/ + PASSAGEWAY_16129, /*Wall staircase*/ + PASSAGEWAY_16130, /*Wall staircase*/ + PASSAGEWAY_16131, /*Wall staircase*/ + PASSAGEWAY_16132, /*Wall staircase*/ + PASSAGEWAY_16133, /*Wall staircase*/ + PASSAGEWAY_16134, /*Wall staircase*/ + PASSAGEWAY_18307, /*Wall staircase*/ + PASSAGEWAY_18308, /*Wall staircase*/ + PASSAGEWAY_18309, /*Wall staircase*/ + PASSAGEWAY_18310, /*Wall staircase*/ + PASSAGEWAY_18311, /*Wall staircase*/ + PASSAGEWAY_20488, /*Wall staircase*/ + PASSAGEWAY_20489, /*Wall staircase*/ + PASSAGEWAY_20490, /*Wall staircase*/ + PASSAGEWAY_20491, /*Wall staircase*/ + PASSAGEWAY_20492, /*Wall staircase*/ + PASSAGEWAY_20493, /*Wall staircase*/ + PASSAGEWAY_20495, /*Wall staircase*/ + PASSAGEWAY_20497, /*Wall staircase*/ + PASSAGEWAY_20498, /*Wall staircase*/ + PASSAGEWAY_20499, /*Wall staircase*/ + PASSAGEWAY_20500, /*Wall staircase*/ + PASSAGEWAY_20501, /*Wall staircase*/ + PASSAGEWAY_20502, /*Wall staircase*/ + PASSAGEWAY_20503, /*Wall staircase*/ + PASSAGEWAY_20504, /*Wall staircase*/ + PASSAGEWAY_20505, /*Wall staircase*/ + PASSAGEWAY_20506, /*Wall staircase*/ + PASSAGEWAY_20506, /*Wall staircase*/ + PASSAGEWAY_20507, /*Wall staircase*/ + PASSAGEWAY_20509, /*Wall staircase*/ + PASSAGEWAY_20510, /*Wall staircase*/ + PASSAGEWAY_20511, /*Wall staircase*/ + PASSAGEWAY_20512, /*Wall staircase*/ + PASSAGEWAY_20513, /*Wall staircase*/ + PASSAGEWAY_20514, /*Wall staircase*/ + PASSAGEWAY_20515, /*Wall staircase*/ + PASSAGEWAY_20516, /*Wall staircase*/ + PASSAGEWAY_20517, /*Wall staircase*/ + PASSAGEWAY_20518, /*Wall staircase*/ + PASSAGEWAY_20519, /*Wall staircase*/ + PASSAGEWAY_20520, /*Wall staircase*/ + PASSAGEWAY_20521, /*Wall staircase*/ + PASSAGEWAY_20522, /*Wall staircase*/ + PASSAGEWAY_20523, /*Wall staircase*/ + PASSAGEWAY_20524, /*Wall staircase*/ + PASSAGEWAY_20525, /*Wall staircase*/ + PASSAGEWAY_20526, /*Wall staircase*/ + PASSAGEWAY_20527, /*Wall staircase*/ + PASSAGEWAY_20528, /*Wall staircase*/ + PASSAGEWAY_20529, /*Wall staircase*/ + PASSAGEWAY_20530, /*Wall staircase*/ + PASSAGEWAY_20531, /*Wall staircase*/ + PASSAGEWAY_20532, /*Wall staircase*/ + PASSAGEWAY_20533, /*Wall staircase*/ + PASSAGEWAY_20534, /*Wall staircase*/ + PASSAGEWAY_20535, /*Wall staircase*/ + PASSAGEWAY_20536, /*Wall staircase*/ + PASSAGEWAY_20537, /*Wall staircase*/ + PASSAGEWAY_20538, /*Wall staircase*/ + PASSAGEWAY_20539, /*Wall staircase*/ + STAIRS_17098, /*Floor staircase*/ + STAIRS_17099, /*Floor staircase*/ + STAIRS_18973, /*Floor staircase*/ + STAIRS_18974 /*Floor staircase*/ + ); + + static final Set WALL_TRAP_IDS = Sets.newHashSet( + WALL_20590, /*Wall spikes*/ + WALL_20592, /*Wall spikes*/ + WALL_20594, /*Wall spikes*/ + WALL_20596, /*Wall spikes*/ + WALL_20588, /*Wall spikes*/ + WALL_20613, /*Wall pusher*/ + WALL_20615, /*Wall pusher*/ + WALL_20616, /*Wall pusher*/ + WALL_20618, /*Wall pusher*/ + HANGING_LOG_20571, /*Hanging log*/ + HANGING_LOG_20572, /*Hanging log*/ + HANGING_LOG_20573, /*Hanging log*/ + HANGING_LOG_20574 /*Hanging log*/ + ); + + static final Set FLOOR_TRAP_IDS = Sets.newHashSet( + FLOOR_20583, /*Floor spikes*/ + FLOOR_20584, /*Floor spikes*/ + NULL_20575, /*Floor spikes (visible)*/ + FLOOR_20628, /*Trapdoor*/ + FLOOR_20634, /*Floor button*/ + FLOOR_20636 /*Floor button*/ + ); +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairOverlay.java new file mode 100644 index 0000000000..e7ed05731e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairOverlay.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018, Shaun Dreclin + * 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.tarnslair; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Polygon; +import javax.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.coords.LocalPoint; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; + +@Slf4j +public class TarnsLairOverlay extends Overlay +{ + private static final int MAX_DISTANCE = 2350; + + private final Client client; + private final TarnsLairPlugin plugin; + + @Inject + public TarnsLairOverlay(Client client, TarnsLairPlugin plugin) + { + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_SCENE); + this.client = client; + this.plugin = plugin; + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (!plugin.isInLair()) + { + return null; + } + + LocalPoint playerLocation = client.getLocalPlayer().getLocalLocation(); + + plugin.getStaircases().forEach((obstacle, tile) -> + { + if (tile.getPlane() == client.getPlane() && obstacle.getLocalLocation().distanceTo(playerLocation) < MAX_DISTANCE) + { + Polygon p = tile.getGameObjects()[0].getConvexHull(); + if (p != null) + { + graphics.setColor(Color.GREEN); + graphics.drawPolygon(p); + } + } + }); + + plugin.getWallTraps().forEach((obstacle, tile) -> + { + if (tile.getPlane() == client.getPlane() && obstacle.getLocalLocation().distanceTo(playerLocation) < MAX_DISTANCE) + { + Polygon p = tile.getGameObjects()[0].getConvexHull(); + if (p != null) + { + graphics.setColor(Color.CYAN); + graphics.drawPolygon(p); + } + } + }); + + plugin.getFloorTraps().forEach((obstacle, tile) -> + { + if (tile.getPlane() == client.getPlane() && obstacle.getLocalLocation().distanceTo(playerLocation) < MAX_DISTANCE) + { + Polygon p = obstacle.getCanvasTilePoly(); + if (p != null) + { + graphics.setColor(Color.CYAN); + graphics.drawPolygon(p); + } + } + }); + + return null; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairPlugin.java new file mode 100644 index 0000000000..c262ad813d --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tarnslair/TarnsLairPlugin.java @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2018-2019, Shaun Dreclin + * 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.tarnslair; + +import java.util.HashMap; +import javax.inject.Inject; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Tile; +import net.runelite.api.TileObject; +import net.runelite.api.events.GameObjectChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.GroundObjectChanged; +import net.runelite.api.events.GroundObjectDespawned; +import net.runelite.api.events.GroundObjectSpawned; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.ui.overlay.OverlayManager; + +@PluginDescriptor( + name = "Tarn's Lair", + description = "Mark tiles and clickboxes to help traverse the maze", + tags = {"agility", "maze", "minigame", "overlay"} +) +@Slf4j +public class TarnsLairPlugin extends Plugin +{ + private static final int TARNS_LAIR_NORTH_REGION = 12616; + private static final int TARNS_LAIR_SOUTH_REGION = 12615; + + @Getter(AccessLevel.PACKAGE) + private final HashMap staircases = new HashMap<>(); + + @Getter(AccessLevel.PACKAGE) + private final HashMap wallTraps = new HashMap<>(); + + @Getter(AccessLevel.PACKAGE) + private final HashMap floorTraps = new HashMap<>(); + + @Getter(AccessLevel.PACKAGE) + private boolean inLair; + + @Inject + private Client client; + + @Inject + private OverlayManager overlayManager; + + @Inject + private TarnsLairOverlay overlay; + + @Override + protected void startUp() throws Exception + { + overlayManager.add(overlay); + } + + @Override + protected void shutDown() throws Exception + { + overlayManager.remove(overlay); + staircases.clear(); + wallTraps.clear(); + floorTraps.clear(); + inLair = false; + } + + @Subscribe + public void onGameTick(GameTick event) + { + int regionID = client.getLocalPlayer().getWorldLocation().getRegionID(); + inLair = (regionID == TARNS_LAIR_NORTH_REGION || regionID == TARNS_LAIR_SOUTH_REGION); + } + + @Subscribe + public void onGameObjectSpawned(GameObjectSpawned event) + { + onTileObject(event.getTile(), null, event.getGameObject()); + } + + @Subscribe + public void onGameObjectChanged(GameObjectChanged event) + { + onTileObject(event.getTile(), event.getPrevious(), event.getGameObject()); + } + + @Subscribe + public void onGameObjectDespawned(GameObjectDespawned event) + { + onTileObject(event.getTile(), event.getGameObject(), null); + } + + @Subscribe + public void onGroundObjectSpawned(GroundObjectSpawned event) + { + onTileObject(event.getTile(), null, event.getGroundObject()); + } + + @Subscribe + public void onGroundObjectChanged(GroundObjectChanged event) + { + onTileObject(event.getTile(), event.getPrevious(), event.getGroundObject()); + } + + @Subscribe + public void onGroundObjectDespawned(GroundObjectDespawned event) + { + onTileObject(event.getTile(), event.getGroundObject(), null); + } + + @Subscribe + public void onGameStateChanged(GameStateChanged event) + { + if (event.getGameState() == GameState.LOADING) + { + staircases.clear(); + wallTraps.clear(); + floorTraps.clear(); + } + } + + private void onTileObject(Tile tile, TileObject oldObject, TileObject newObject) + { + staircases.remove(oldObject); + if (newObject != null && Obstacles.STAIRCASE_IDS.contains(newObject.getId())) + { + staircases.put(newObject, tile); + } + + wallTraps.remove(oldObject); + if (newObject != null && Obstacles.WALL_TRAP_IDS.contains(newObject.getId())) + { + wallTraps.put(newObject, tile); + } + + floorTraps.remove(oldObject); + if (newObject != null && Obstacles.FLOOR_TRAP_IDS.contains(newObject.getId())) + { + floorTraps.put(newObject, tile); + } + } +} From 67ffeb7119acd7cfd6874911fc28100be62cb4bf Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 23 Apr 2019 21:46:56 +0200 Subject: [PATCH 03/21] API addons/cleanup Hydra animations/projectiles Cleanup on isle varbits n shit --- .../java/net/runelite/api/AnimationID.java | 22 +++++++++++++++++++ .../java/net/runelite/api/InventoryID.java | 8 +++---- .../java/net/runelite/api/ProjectileID.java | 6 +++++ .../main/java/net/runelite/api/SpriteID.java | 2 +- .../main/java/net/runelite/api/Varbits.java | 8 +++---- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/AnimationID.java b/runelite-api/src/main/java/net/runelite/api/AnimationID.java index b488d21512..0a6060953a 100644 --- a/runelite-api/src/main/java/net/runelite/api/AnimationID.java +++ b/runelite-api/src/main/java/net/runelite/api/AnimationID.java @@ -213,4 +213,26 @@ public final class AnimationID public static final int LOW_LEVEL_MAGIC_ATTACK = 1162; public static final int HIGH_LEVEL_MAGIC_ATTACK = 1167; public static final int BLOWPIPE_ATTACK = 5061; + + // Hydra + public static final int HYDRA_POISON_1 = 8234; + public static final int HYDRA_RANGED_1 = 8235; + public static final int HYDRA_MAGIC_1 = 8236; + public static final int HYDRA_1_1 = 8237; + public static final int HYDRA_1_2 = 8238; + public static final int HYDRA_LIGHTNING = 8241; + public static final int HYDRA_RANGED_2 = 8242; + public static final int HYDRA_MAGIC_2 = 8243; + public static final int HYDRA_2_1 = 8244; + public static final int HYDRA_2_2 = 8245; + public static final int HYDRA_FIRE = 8248; + public static final int HYDRA_RANGED_3 = 8249; + public static final int HYDRA_MAGIC_3 = 8250; + public static final int HYDRA_3_1 = 8251; + public static final int HYDRA_3_2 = 8252; + public static final int HYDRA_MAGIC_4 = 8254; + public static final int HYDRA_POISON_4 = 8254; + public static final int HYDRA_RANGED_4 = 8255; + public static final int HYDRA_4_1 = 8257; + public static final int HYDRA_4_2 = 8258; } \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/InventoryID.java b/runelite-api/src/main/java/net/runelite/api/InventoryID.java index ff099afd70..df3f995df9 100644 --- a/runelite-api/src/main/java/net/runelite/api/InventoryID.java +++ b/runelite-api/src/main/java/net/runelite/api/InventoryID.java @@ -53,14 +53,14 @@ public enum InventoryID * Monkey madness puzzle box inventory. */ MONKEY_MADNESS_PUZZLE_BOX(221), - /** - * Chambers of Xeric chest inventory. - */ - CHAMBERS_OF_XERIC_CHEST(581), /** * Looting Bag inventory */ LOOTING_BAG(516), + /** + * Chambers of Xeric chest inventory. + */ + CHAMBERS_OF_XERIC_CHEST(581), /** * Theater of Blood reward chest inventory (Raids 2) */ diff --git a/runelite-api/src/main/java/net/runelite/api/ProjectileID.java b/runelite-api/src/main/java/net/runelite/api/ProjectileID.java index 34d5c54f3a..267675ad58 100644 --- a/runelite-api/src/main/java/net/runelite/api/ProjectileID.java +++ b/runelite-api/src/main/java/net/runelite/api/ProjectileID.java @@ -84,4 +84,10 @@ public class ProjectileID public static final int VORKATH_PRAYER_DISABLE = 1471; public static final int VORKATH_VENOM = 1470; public static final int VORKATH_ICE = 350; + + public static final int HYDRA_MAGIC = 1662; + public static final int HYDRA_RANGED = 1663; + public static final int HYDRA_POISON = 1644; + public static final int HYDRA_LIGHTNING = 1664; + public static final int HYDRA_LIGHTNING_2 = 1665; } diff --git a/runelite-api/src/main/java/net/runelite/api/SpriteID.java b/runelite-api/src/main/java/net/runelite/api/SpriteID.java index e707854c12..797d2ae078 100644 --- a/runelite-api/src/main/java/net/runelite/api/SpriteID.java +++ b/runelite-api/src/main/java/net/runelite/api/SpriteID.java @@ -431,7 +431,7 @@ public final class SpriteID public static final int SPELL_FIRE_SURGE_DISABLED = 415; /* Unmapped: 416, 417, 418 */ public static final int UNKNOWN_STANCE_ICON_1 = 419; - public static final int UNKNOWN_STANCE_ICON_2 = 320; + public static final int UNKNOWN_STANCE_ICON_2 = 420; public static final int UNKNOWN_STANCE_ICON_3 = 421; public static final int MINIMAP_DESTINATION_FLAG = 422; public static final int CHATBOX_BADGE_CROWN_PLAYER_MODERATOR = 423; diff --git a/runelite-api/src/main/java/net/runelite/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java index 987115bd28..f7223a237d 100644 --- a/runelite-api/src/main/java/net/runelite/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -32,7 +32,8 @@ import lombok.Getter; */ @AllArgsConstructor @Getter -public enum Varbits { +public enum Varbits +{ /* * If chatbox is transparent or not */ @@ -484,10 +485,9 @@ public enum Varbits { GE_OFFER_CREATION_TYPE(4397), - /* + /** * Spells being auto-casted - * - * */ + */ AUTO_CAST_SPELL(276), From f34b945c292cfcb17815c251182e87124fec13f5 Mon Sep 17 00:00:00 2001 From: James Munson Date: Tue, 23 Apr 2019 20:44:06 -0700 Subject: [PATCH 04/21] Updated added invokeMenuAction to api, removed example plugin --- .../main/java/net/runelite/api/Client.java | 4 + .../net/runelite/api/widgets/WidgetID.java | 26 +++ .../client/plugins/example/ExamplePlugin.java | 162 ------------------ .../java/net/runelite/rs/api/RSClient.java | 3 + 4 files changed, 33 insertions(+), 162 deletions(-) delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/example/ExamplePlugin.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 57d0c92600..2dd129aa7c 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -1391,6 +1391,7 @@ public interface Client extends GameEngine */ void setClanMatesHidden(boolean state); + /** * Sets whether the local player is hidden. * @@ -1610,4 +1611,7 @@ public interface Client extends GameEngine void draw2010Menu(); NodeCache getHealthBarCache(); + + void invokeMenuAction(int var1, int var2, int var3, int var4, String var5, String var6, int var7, int var8); + } diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index ba9e8ea8cc..ffd20e7eb9 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -1001,4 +1001,30 @@ static final int WIND_STRIKE = 5; static final int CUSTOM_TEXT_CONTAINER = 33; } + + public static class TradeScreen { + public static final int SECOND_GROUP_ID = 334; + public static final int SECOND_TRADING_WITH = 30; + public static final int SECOND_MY_OFFER = 23; + public static final int SECOND_THEIR_OFFER = 24; + public static final int SECOND_ACCEPT_FUNC = 13; + public static final int SECOND_ACCEPT_TEXT = 25; + } + + public static class DuelConfig { + public static final int CONFIG_GROUP_IP = 482; + public static final int TITLE = 35; + public static final int OPPONENT_ATT = 9; + public static final int OPPONENT_STR = 13; + public static final int OPPONENT_DEF = 17; + public static final int OPPONENT_HP = 21; + } + + public static class DuelResult { + public static final int RESULT_GROUP_ID = 372; + public static final int TITLE = 16; + public static final int TOTAL_STAKED = 32; + public static final int TOTAL_TAX = 39; + public static final int WINNINGS = 40; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/example/ExamplePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/example/ExamplePlugin.java deleted file mode 100644 index a608699885..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/example/ExamplePlugin.java +++ /dev/null @@ -1,162 +0,0 @@ -package net.runelite.client.plugins.example; - -import java.awt.Graphics2D; -import java.awt.geom.AffineTransform; -import java.awt.image.BufferedImage; -import java.util.EnumSet; -import java.util.HashSet; -import javax.inject.Inject; -import net.runelite.api.Client; -import net.runelite.api.GameState; -import net.runelite.api.ItemID; -import net.runelite.api.Point; -import net.runelite.api.SpriteID; -import net.runelite.api.coords.WorldPoint; -import net.runelite.client.callback.ClientThread; -import net.runelite.client.game.ItemManager; -import net.runelite.client.game.SpriteManager; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.cluescrolls.clues.emote.STASHUnit; -import net.runelite.client.ui.overlay.arrow.ArrowPoint; -import net.runelite.client.ui.overlay.arrow.ArrowPointManager; -import net.runelite.client.ui.overlay.arrow.ArrowType; - -@PluginDescriptor( - name = "ArrowTest", - developerPlugin = true -) -public class ExamplePlugin extends Plugin -{ - @Inject - private ArrowPointManager arrowPointManager; - - @Inject - private SpriteManager spriteManager; - - @Inject - private ItemManager itemManager; - - @Inject - private Client client; - - @Inject - private ClientThread clientThread; - - private boolean firstLogin = true; - - @Override - public void startUp() throws Exception - { - clientThread.invokeLater(this::loadArrows); - } - - @Override - public void shutDown() - { - arrowPointManager.clear(); - } - - public void loadArrows() - { - if (client.getGameState() != GameState.LOGGED_IN) - { - return; - } - - BufferedImage i = spriteManager.getSprite(SpriteID.MINIMAP_GUIDE_ARROW_YELLOW, 0); - - BufferedImage i3 = spriteManager.getSprite(SpriteID.RED_GUIDE_ARROW, 0); - AffineTransform at = new AffineTransform(); - at.concatenate(AffineTransform.getScaleInstance(1, -1)); - at.concatenate(AffineTransform.getTranslateInstance(0, -i3.getHeight())); - BufferedImage i4 = new BufferedImage(i3.getWidth(), i3.getHeight(), BufferedImage.TYPE_INT_ARGB); - Graphics2D g = i4.createGraphics(); - g.transform(at); - g.drawImage(i3, 0, 0, null); - g.dispose(); - - Point i3Offset = new Point(0, i3.getHeight() / -2); - - ArrowPoint one = ArrowPoint.builder() - .worldPoint(new WorldPoint(1554, 3551, 0)) - .minimapImage(i4) - .worldImage(i) - .minimapImageOffset(i3Offset) - .types(EnumSet.of(ArrowType.MINIMAP, ArrowType.WORLD_POINT)) - .build(); - //arrowPointManager.add(this, one); - - ArrowPoint two = ArrowPoint.builder() - .worldPoint(new WorldPoint(1544, 3580, 0)) - .minimapImage(i4) - .worldImage(i) - .minimapImageOffset(i3Offset) - .types(EnumSet.of(ArrowType.MINIMAP, ArrowType.WORLD_POINT)) - .build(); - //arrowPointManager.add(this, two); - - ArrowPoint three = ArrowPoint.builder() - .worldPoint(new WorldPoint(1571, 3541, 0)) - .minimapImage(i4) - .worldImage(i) - .minimapImageOffset(i3Offset) - .types(EnumSet.of(ArrowType.MINIMAP, ArrowType.WORLD_POINT)) - .build(); - //arrowPointManager.add(this, three); - - HashSet NPCs = new HashSet<>(); - NPCs.add(6910); - - ArrowPoint npcone = ArrowPoint.builder() - .worldPoint(new WorldPoint(1545, 3595, 0)) - .minimapImage(i4) - .worldImage(i) - .minimapImageOffset(i3Offset) - .npcIDs(NPCs) - .types(EnumSet.of(ArrowType.MINIMAP, ArrowType.NPC)) - .build(); - //arrowPointManager.add(this, npcone); - - HashSet NPCs2 = new HashSet<>(); - NPCs2.add(6889); - NPCs2.add(6883); - NPCs2.add(6885); - - ArrowPoint npctwo = ArrowPoint.builder() - .worldPoint(new WorldPoint(1551, 3561, 0)) - .minimapImage(i4) - .worldImage(i) - .minimapImageOffset(i3Offset) - .worldImageOffset(new Point(0, -i4.getHeight())) - .npcIDs(NPCs2) - .types(EnumSet.of(ArrowType.MINIMAP, ArrowType.NPC)) - .build(); - //arrowPointManager.add(this, npctwo); - - HashSet OBJs = new HashSet<>(); - OBJs.add(STASHUnit.SHAYZIEN_WAR_TENT); - - ArrowPoint objone = ArrowPoint.builder() - .worldPoint(new WorldPoint(1550, 3541, 0)) - .minimapImage(i4) - .worldImage(i) - .minimapImageOffset(i3Offset) - .worldImageOffset(new Point(0, -i4.getHeight())) - .objectIDs(OBJs) - .types(EnumSet.of(ArrowType.MINIMAP, ArrowType.OBJECT)) - .build(); - arrowPointManager.add(this, objone); - - BufferedImage i5 = itemManager.getImage(ItemID.BONES); - - ArrowPoint four = ArrowPoint.builder() - .worldPoint(new WorldPoint(1517, 3553, 0)) - .minimapImage(i5) - .worldImage(i5) - .minimapImagePointToTarget(false) - .types(EnumSet.of(ArrowType.MINIMAP, ArrowType.WORLD_POINT)) - .build(); - //arrowPointManager.add(this, four); - } -} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index 77836e550f..f48cdb5bdf 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -375,6 +375,9 @@ public interface RSClient extends RSGameEngine, Client @Import("createSprite") RSSpritePixels createItemSprite(int itemId, int quantity, int thickness, int borderColor, int stackable, boolean noted); + @Override + void invokeMenuAction(int n2, int n3, int n4, int n5, String string, String string2, int n6, int n7); + @Import("decodeSprite") void decodeSprite(byte[] data); From 53cdbc656db4c109def7b1b208fa7bb31a2c21a4 Mon Sep 17 00:00:00 2001 From: James Munson Date: Tue, 23 Apr 2019 20:52:28 -0700 Subject: [PATCH 05/21] Update --- .../plugins/barbarianassault/BarbarianAssaultPlugin.java | 4 +++- .../client/plugins/questhelper/QuestHelperPlugin.java | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java index 7124cd71d2..68de83caa8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java @@ -57,6 +57,7 @@ import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.util.ImageUtil; @@ -64,7 +65,8 @@ import net.runelite.client.util.ImageUtil; @PluginDescriptor( name = "Barbarian Assault", description = "Show a timer to the next call change and game/wave duration in chat.", - tags = {"minigame", "overlay", "timer"} + tags = {"minigame", "overlay", "timer"}, + type = PluginType.PVM ) public class BarbarianAssaultPlugin extends Plugin { private static final int BA_WAVE_NUM_INDEX = 2; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/questhelper/QuestHelperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/questhelper/QuestHelperPlugin.java index b2ab1f85dc..a8a59b4634 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/questhelper/QuestHelperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/questhelper/QuestHelperPlugin.java @@ -50,11 +50,13 @@ import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.util.Text; @PluginDescriptor( name = "Quest Helper", + type = PluginType.UTILITY, description = "Helps you with your quests" ) @Slf4j From b51c7cbd7b5baee5c056d428449d05f804afca6e Mon Sep 17 00:00:00 2001 From: Giovanni Ruddy Gazivoda Date: Wed, 24 Apr 2019 04:17:46 -0400 Subject: [PATCH 06/21] move alchemical hydra from root folder to correct dir --- .../java/net/runelite/client/plugins/alchemicalhydra}/Hydra.java | 0 .../runelite/client/plugins/alchemicalhydra}/HydraOverlay.java | 0 .../net/runelite/client/plugins/alchemicalhydra}/HydraPhase.java | 0 .../net/runelite/client/plugins/alchemicalhydra}/HydraPlugin.java | 0 .../client/plugins/alchemicalhydra}/HydraPoisonOverlay.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {alchemicalhydra => runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra}/Hydra.java (100%) rename {alchemicalhydra => runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra}/HydraOverlay.java (100%) rename {alchemicalhydra => runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra}/HydraPhase.java (100%) rename {alchemicalhydra => runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra}/HydraPlugin.java (100%) rename {alchemicalhydra => runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra}/HydraPoisonOverlay.java (100%) diff --git a/alchemicalhydra/Hydra.java b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/Hydra.java similarity index 100% rename from alchemicalhydra/Hydra.java rename to runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/Hydra.java diff --git a/alchemicalhydra/HydraOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraOverlay.java similarity index 100% rename from alchemicalhydra/HydraOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraOverlay.java diff --git a/alchemicalhydra/HydraPhase.java b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPhase.java similarity index 100% rename from alchemicalhydra/HydraPhase.java rename to runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPhase.java diff --git a/alchemicalhydra/HydraPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPlugin.java similarity index 100% rename from alchemicalhydra/HydraPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPlugin.java diff --git a/alchemicalhydra/HydraPoisonOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPoisonOverlay.java similarity index 100% rename from alchemicalhydra/HydraPoisonOverlay.java rename to runelite-client/src/main/java/net/runelite/client/plugins/alchemicalhydra/HydraPoisonOverlay.java From c31cd4fe50e07127dd1bf1d1ff1be1f0fe7aca22 Mon Sep 17 00:00:00 2001 From: Lucas Date: Wed, 24 Apr 2019 13:43:11 +0200 Subject: [PATCH 07/21] Add spriteID's for hydra (this time) --- runelite-api/src/main/java/net/runelite/api/SpriteID.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/SpriteID.java b/runelite-api/src/main/java/net/runelite/api/SpriteID.java index 797d2ae078..e83c268535 100644 --- a/runelite-api/src/main/java/net/runelite/api/SpriteID.java +++ b/runelite-api/src/main/java/net/runelite/api/SpriteID.java @@ -1566,4 +1566,7 @@ public final class SpriteID public static final int MOBILE_YELLOW_TOUCH_ANIMATION_2 = 1626; public static final int TAB_MAGIC_SPELLBOOK_ARCEUUS_UNUSED = 1708; public static final int TAB_MAGIC_SPELLBOOK_ARCEUUS = 1711; + public static final int BIG_ASS_GUTHIX_SPELL = 1774; + public static final int BIG_SUPERHEAT = 1800; + public static final int BIG_SPEC_TRANSFER = 1959; } From faad960f10ba3398dedb99a5963cff8d553f179b Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Wed, 24 Apr 2019 17:29:41 +0200 Subject: [PATCH 08/21] Antidrag: Add overlay, customizable keybinds (#99) --- .../plugins/antidrag/AntiDragConfig.java | 57 ++++++++++-- .../plugins/antidrag/AntiDragOverlay.java | 47 ++++++++++ .../plugins/antidrag/AntiDragPlugin.java | 89 ++++++++++--------- 3 files changed, 144 insertions(+), 49 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragOverlay.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java index 764a988611..5124905378 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java @@ -24,16 +24,16 @@ */ package net.runelite.client.plugins.antidrag; +import java.awt.Color; +import java.awt.event.KeyEvent; +import net.runelite.client.config.Alpha; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.Keybind; +import net.runelite.client.config.ModifierlessKeybind; -/*@ConfigGroup( - keyName = "antiDrag", - name = "Anti Drag", - description = "Configuration for the anti drag plugin" -)*/ -@ConfigGroup("antidrag") +@ConfigGroup("antiDrag") public interface AntiDragConfig extends Config { @ConfigItem( @@ -46,4 +46,49 @@ public interface AntiDragConfig extends Config { return 600 / 20; // one game tick } + + @ConfigItem( + keyName = "keybind", + name = "keybind", + description = "The keybind you want to use for antidrag", + position = 2 + ) + default Keybind key() + { + return new ModifierlessKeybind(KeyEvent.VK_SHIFT, 0); + } + + @ConfigItem( + keyName = "reqfocus", + name = "Reset on focus loss", + description = "Disable antidrag when losing focus (like alt tabbing)", + position = 3 + ) + default boolean reqfocus() + { + return false; + } + + @ConfigItem( + keyName = "overlay", + name = "Enable overlay", + description = "Do you really need a description?", + position = 4 + ) + default boolean overlay() + { + return true; + } + + @Alpha + @ConfigItem( + keyName = "color", + name = "Overlay color", + description = "Change the overlay color, duh", + position = 5 + ) + default Color color() + { + return new Color(255, 0, 0, 30); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragOverlay.java new file mode 100644 index 0000000000..c19fc3d6c1 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragOverlay.java @@ -0,0 +1,47 @@ +package net.runelite.client.plugins.antidrag; + +import com.google.inject.Inject; +import com.google.inject.Singleton; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import net.runelite.api.Client; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayPriority; + +@Singleton +public class AntiDragOverlay extends Overlay +{ + private static final int RADIUS = 20; + + private Client client; + private AntiDragConfig config; + + @Inject + private AntiDragOverlay(Client client, AntiDragConfig config) + { + this.config = config; + this.client = client; + setPosition(OverlayPosition.TOOLTIP); + setPriority(OverlayPriority.HIGHEST); + setLayer(OverlayLayer.ALWAYS_ON_TOP); + } + + @Override + public Dimension render(Graphics2D g) + { + final Color color = config.color(); + g.setColor(color); + + final net.runelite.api.Point mouseCanvasPosition = client.getMouseCanvasPosition(); + final Point mousePosition = new Point(mouseCanvasPosition.getX() - RADIUS, mouseCanvasPosition.getY() - RADIUS); + final Rectangle bounds = new Rectangle(mousePosition.x, mousePosition.y, 2 * RADIUS, 2 * RADIUS); + g.fillOval(bounds.x, bounds.y, bounds.height, bounds.width); + + return bounds.getSize(); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java index 70f7400d7b..3c1c3eced0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java @@ -24,26 +24,30 @@ */ package net.runelite.client.plugins.antidrag; -import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; -import java.awt.event.KeyEvent; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.events.FocusChanged; import net.runelite.client.config.ConfigManager; -import net.runelite.client.input.KeyListener; +import net.runelite.client.eventbus.Subscribe; import net.runelite.client.input.KeyManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; +import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.util.HotkeyListener; @PluginDescriptor( - name = "Anti Drag", - type = PluginType.UTILITY, - enabledByDefault = false) -public class AntiDragPlugin extends Plugin implements KeyListener + name = "Shift Anti Drag", + description = "Prevent dragging an item for a specified delay", + tags = {"antidrag", "delay", "inventory", "items"}, + type = PluginType.UTILITY, + enabledByDefault = false +) +public class AntiDragPlugin extends Plugin { private static final int DEFAULT_DELAY = 5; + private boolean toggleDrag; @Inject private Client client; @@ -51,6 +55,12 @@ public class AntiDragPlugin extends Plugin implements KeyListener @Inject private AntiDragConfig config; + @Inject + private AntiDragOverlay overlay; + + @Inject + private OverlayManager overlayManager; + @Inject private KeyManager keyManager; @@ -63,57 +73,50 @@ public class AntiDragPlugin extends Plugin implements KeyListener @Override protected void startUp() throws Exception { - client.setInventoryDragDelay(config.dragDelay()); - keyManager.registerKeyListener(this); + keyManager.registerKeyListener(hotkeyListener); + toggleDrag = false; + } @Override protected void shutDown() throws Exception { client.setInventoryDragDelay(DEFAULT_DELAY); - keyManager.unregisterKeyListener(this); + keyManager.unregisterKeyListener(hotkeyListener); + toggleDrag = false; + overlayManager.remove(overlay); } - @Override - public void keyTyped(KeyEvent e) + private final HotkeyListener hotkeyListener = new HotkeyListener(() -> config.key()) { - - } - - public boolean toggleDrag = true; - - @Override - public void keyPressed(KeyEvent e) - { - /*if (e.getKeyCode() == KeyEvent.VK_SHIFT) + @Override + public void hotkeyPressed() { - client.setInventoryDragDelay(config.dragDelay()); + toggleDrag = !toggleDrag; + if (toggleDrag) + { + if (config.overlay()) + { + overlayManager.add(overlay); + } + + client.setInventoryDragDelay(config.dragDelay()); + } + else + { + overlayManager.remove(overlay); + client.setInventoryDragDelay(DEFAULT_DELAY); + } } - client.setInventoryDragDelay(config.dragDelay());*/ - } + }; - @Override - public void keyReleased(KeyEvent e) - { - if (e.getKeyCode() == KeyEvent.VK_CONTROL && toggleDrag) { - - toggleDrag = false; - client.setInventoryDragDelay(DEFAULT_DELAY); - - } else if (e.getKeyCode() == KeyEvent.VK_CONTROL && !toggleDrag) { - - toggleDrag = true; - client.setInventoryDragDelay(config.dragDelay()); - - } - } - - /*@Subscribe + @Subscribe public void onFocusChanged(FocusChanged focusChanged) { - if (!focusChanged.isFocused()) + if (!focusChanged.isFocused() && config.reqfocus()) { client.setInventoryDragDelay(DEFAULT_DELAY); + overlayManager.remove(overlay); } - }*/ + } } From 0f3d7e88770000fc2ccbd6ffde6a8168456e4b26 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sat, 20 Apr 2019 13:45:27 +0200 Subject: [PATCH 09/21] Do not count local player in nearby clan member counter Signed-off-by: Tomas Slusny --- .../plugins/clanchat/ClanChatPlugin.java | 631 ++++++++++++------ 1 file changed, 413 insertions(+), 218 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java index f52ebd7260..3f46869425 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java @@ -1,30 +1,89 @@ +/* + * Copyright (c) 2017, Devin French + * Copyright (c) 2019, Adam + * Copyright (c) 2018, trimbe + * 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.clanchat; -import net.runelite.client.plugins.*; -import net.runelite.client.game.*; -import net.runelite.client.callback.*; - +import com.google.common.base.Strings; +import com.google.common.collect.Lists; +import com.google.inject.Provides; +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; -import java.util.Objects; -import java.util.concurrent.*; -import net.runelite.client.config.*; -import com.google.inject.*; -import net.runelite.client.util.*; -import net.runelite.client.eventbus.*; -import com.google.common.base.*; -import net.runelite.api.widgets.*; -import net.runelite.client.ui.*; -import net.runelite.client.chat.*; -import java.awt.*; -import net.runelite.api.*; -import net.runelite.api.events.*; -import com.google.common.collect.*; -import java.util.*; -import java.util.function.*; -import net.runelite.client.ui.overlay.infobox.*; -import java.awt.image.*; +import java.util.Map; +import javax.inject.Inject; +import net.runelite.api.ChatLineBuffer; +import net.runelite.api.ChatMessageType; +import net.runelite.api.ClanMember; +import net.runelite.api.ClanMemberRank; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.MessageNode; +import net.runelite.api.Player; +import net.runelite.api.ScriptID; +import net.runelite.api.SpriteID; +import net.runelite.api.VarClientStr; +import net.runelite.api.Varbits; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ClanChanged; +import net.runelite.api.events.ClanMemberJoined; +import net.runelite.api.events.ClanMemberLeft; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.PlayerDespawned; +import net.runelite.api.events.PlayerSpawned; +import net.runelite.api.events.VarClientStrChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetType; +import net.runelite.client.callback.ClientThread; +import net.runelite.client.chat.ChatMessageBuilder; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.ClanManager; +import net.runelite.client.game.SpriteManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import static net.runelite.client.ui.JagexColors.CHAT_CLAN_NAME_OPAQUE_BACKGROUND; +import static net.runelite.client.ui.JagexColors.CHAT_CLAN_NAME_TRANSPARENT_BACKGROUND; +import static net.runelite.client.ui.JagexColors.CHAT_CLAN_TEXT_OPAQUE_BACKGROUND; +import static net.runelite.client.ui.JagexColors.CHAT_CLAN_TEXT_TRANSPARENT_BACKGROUND; +import net.runelite.client.ui.overlay.infobox.InfoBoxManager; +import net.runelite.client.util.Text; -@PluginDescriptor(name = "Clan Chat", description = "Add rank icons to users talking in clan chat", tags = { "icons", "rank", "recent" }) +@PluginDescriptor( + name = "Clan Chat", + description = "Add rank icons to users talking in clan chat", + tags = {"icons", "rank", "recent"} +) public class ClanChatPlugin extends Plugin { private static final int MAX_CHATS = 10; @@ -32,376 +91,512 @@ public class ClanChatPlugin extends Plugin private static final String RECENT_TITLE = "Recent Clan Chats"; private static final int JOIN_LEAVE_DURATION = 20; private static final int MESSAGE_DELAY = 10; + @Inject private Client client; + @Inject private ClanManager clanManager; + @Inject private ClanChatConfig config; + @Inject private InfoBoxManager infoBoxManager; + @Inject private SpriteManager spriteManager; + @Inject private ClientThread clientThread; - private List chats; - private static CopyOnWriteArrayList clanMembers; + + private List chats = new ArrayList<>(); + private List clanMembers = new ArrayList<>(); private ClanChatIndicator clanMemberCounter; - private final Deque clanJoinMessages; - private Map activityBuffer; + /** + * queue of temporary messages added to the client + */ + private final Deque clanJoinMessages = new ArrayDeque<>(); + private Map activityBuffer = new HashMap<>(); private int clanJoinedTick; - public ClanChatPlugin() { - this.chats = new ArrayList(); - this.clanJoinMessages = new ArrayDeque(); - this.activityBuffer = new HashMap(); - } - - public static CopyOnWriteArrayList getClanMembers() { - return (CopyOnWriteArrayList)ClanChatPlugin.clanMembers.clone(); - } - @Provides - ClanChatConfig getConfig(final ConfigManager configManager) { + ClanChatConfig getConfig(ConfigManager configManager) + { return configManager.getConfig(ClanChatConfig.class); } - public void startUp() { - this.chats = new ArrayList(Text.fromCSV(this.config.chatsData())); + @Override + public void startUp() + { + chats = new ArrayList<>(Text.fromCSV(config.chatsData())); } - public void shutDown() { - ClanChatPlugin.clanMembers.clear(); - this.removeClanCounter(); - this.resetClanChats(); + @Override + public void shutDown() + { + clanMembers.clear(); + removeClanCounter(); + resetClanChats(); } @Subscribe - public void onConfigChanged(final ConfigChanged configChanged) { - if (configChanged.getGroup().equals("clanchat")) { - if (!this.config.recentChats()) { - this.resetClanChats(); + public void onConfigChanged(ConfigChanged configChanged) + { + if (configChanged.getGroup().equals("clanchat")) + { + if (!config.recentChats()) + { + resetClanChats(); } - if (this.config.showClanCounter()) { - this.clientThread.invoke(this::addClanCounter); + + if (config.showClanCounter()) + { + clientThread.invoke(this::addClanCounter); } - else { - this.removeClanCounter(); + else + { + removeClanCounter(); } } } @Subscribe - public void onClanMemberJoined(final ClanMemberJoined event) { + public void onClanMemberJoined(ClanMemberJoined event) + { final ClanMember member = event.getMember(); - if (member.getWorld() == this.client.getWorld()) { + + if (member.getWorld() == client.getWorld()) + { + final Player local = client.getLocalPlayer(); final String memberName = Text.toJagexName(member.getUsername()); - for (final Player player : this.client.getPlayers()) { - if (player != null && memberName.equals(Text.toJagexName(player.getName()))) { - ClanChatPlugin.clanMembers.add(player); - this.addClanCounter(); + + for (final Player player : client.getPlayers()) + { + if (player != null && player != local && memberName.equals(Text.toJagexName(player.getName()))) + { + clanMembers.add(player); + addClanCounter(); break; } } } - if (this.clanJoinedTick == this.client.getTickCount()) { + + // clan members getting initialized isn't relevant + if (clanJoinedTick == client.getTickCount()) + { return; } - if (!this.config.showJoinLeave() || member.getRank().getValue() < this.config.joinLeaveRank().getValue()) { + + if (!config.showJoinLeave() || + member.getRank().getValue() < config.joinLeaveRank().getValue()) + { return; } - if (!this.activityBuffer.containsKey(member.getUsername())) { - final ClanMemberActivity joinActivity = new ClanMemberActivity(ClanActivityType.JOINED, member, this.client.getTickCount()); - this.activityBuffer.put(member.getUsername(), joinActivity); + + // attempt to filter out world hopping joins + if (!activityBuffer.containsKey(member.getUsername())) + { + ClanMemberActivity joinActivity = new ClanMemberActivity(ClanActivityType.JOINED, + member, client.getTickCount()); + activityBuffer.put(member.getUsername(), joinActivity); } - else { - this.activityBuffer.remove(member.getUsername()); + else + { + activityBuffer.remove(member.getUsername()); } } @Subscribe - public void onClanMemberLeft(final ClanMemberLeft event) { + public void onClanMemberLeft(ClanMemberLeft event) + { final ClanMember member = event.getMember(); - if (member.getWorld() == this.client.getWorld()) { + + if (member.getWorld() == client.getWorld()) + { final String memberName = Text.toJagexName(member.getUsername()); - final Iterator each = ClanChatPlugin.clanMembers.iterator(); - while (each.hasNext()) { - if (memberName.equals(Text.toJagexName(each.next().getName()))) { + final Iterator each = clanMembers.iterator(); + + while (each.hasNext()) + { + if (memberName.equals(Text.toJagexName(each.next().getName()))) + { each.remove(); - if (ClanChatPlugin.clanMembers.isEmpty()) { - this.removeClanCounter(); - break; + + if (clanMembers.isEmpty()) + { + removeClanCounter(); } + break; } } } - if (!this.config.showJoinLeave() || member.getRank().getValue() < this.config.joinLeaveRank().getValue()) { + + if (!config.showJoinLeave() || + member.getRank().getValue() < config.joinLeaveRank().getValue()) + { return; } - if (!this.activityBuffer.containsKey(member.getUsername())) { - final ClanMemberActivity leaveActivity = new ClanMemberActivity(ClanActivityType.LEFT, member, this.client.getTickCount()); - this.activityBuffer.put(member.getUsername(), leaveActivity); + + if (!activityBuffer.containsKey(member.getUsername())) + { + ClanMemberActivity leaveActivity = new ClanMemberActivity(ClanActivityType.LEFT, + member, client.getTickCount()); + activityBuffer.put(member.getUsername(), leaveActivity); } - else { - this.activityBuffer.remove(member.getUsername()); + else + { + activityBuffer.remove(member.getUsername()); } } @Subscribe - public void onGameTick(final GameTick gameTick) { - if (this.client.getGameState() != GameState.LOGGED_IN) { + public void onGameTick(GameTick gameTick) + { + if (client.getGameState() != GameState.LOGGED_IN) + { return; } - final Widget clanChatTitleWidget = this.client.getWidget(WidgetInfo.CLAN_CHAT_TITLE); - if (clanChatTitleWidget != null) { - final Widget clanChatList = this.client.getWidget(WidgetInfo.CLAN_CHAT_LIST); - final Widget owner = this.client.getWidget(WidgetInfo.CLAN_CHAT_OWNER); - if (this.client.getClanChatCount() > 0) { - clanChatTitleWidget.setText("Clan Chat (" + this.client.getClanChatCount() + "/100)"); + + Widget clanChatTitleWidget = client.getWidget(WidgetInfo.CLAN_CHAT_TITLE); + if (clanChatTitleWidget != null) + { + Widget clanChatList = client.getWidget(WidgetInfo.CLAN_CHAT_LIST); + Widget owner = client.getWidget(WidgetInfo.CLAN_CHAT_OWNER); + if (client.getClanChatCount() > 0) + { + clanChatTitleWidget.setText(CLAN_CHAT_TITLE + " (" + client.getClanChatCount() + "/100)"); } - else if (this.config.recentChats() && clanChatList.getChildren() == null && !Strings.isNullOrEmpty(owner.getText())) { - clanChatTitleWidget.setText("Recent Clan Chats"); - this.loadClanChats(); + else if (config.recentChats() && clanChatList.getChildren() == null && !Strings.isNullOrEmpty(owner.getText())) + { + clanChatTitleWidget.setText(RECENT_TITLE); + + loadClanChats(); } } - if (!this.config.showJoinLeave()) { + + if (!config.showJoinLeave()) + { return; } - this.timeoutClanMessages(); - this.addClanActivityMessages(); + + timeoutClanMessages(); + + addClanActivityMessages(); } - private void timeoutClanMessages() { - if (this.clanJoinMessages.isEmpty()) { + private void timeoutClanMessages() + { + if (clanJoinMessages.isEmpty()) + { return; } + boolean removed = false; - final Iterator it = this.clanJoinMessages.iterator(); - while (it.hasNext()) { - final ClanJoinMessage clanJoinMessage = it.next(); - final MessageNode messageNode = clanJoinMessage.getMessageNode(); + + for (Iterator it = clanJoinMessages.iterator(); it.hasNext(); ) + { + ClanJoinMessage clanJoinMessage = it.next(); + MessageNode messageNode = clanJoinMessage.getMessageNode(); final int createdTick = clanJoinMessage.getTick(); - if (this.client.getTickCount() <= createdTick + 20) { + + if (client.getTickCount() > createdTick + JOIN_LEAVE_DURATION) + { + it.remove(); + + // If this message has been reused since, it will get a different id + if (clanJoinMessage.getGetMessageId() == messageNode.getId()) + { + ChatLineBuffer ccInfoBuffer = client.getChatLineMap().get(ChatMessageType.FRIENDSCHATNOTIFICATION.getType()); + if (ccInfoBuffer != null) + { + ccInfoBuffer.removeMessageNode(messageNode); + removed = true; + } + } + } + else + { + // Everything else in the deque is newer break; } - it.remove(); - if (clanJoinMessage.getGetMessageId() != messageNode.getId()) { - continue; - } - final ChatLineBuffer ccInfoBuffer = this.client.getChatLineMap().get(ChatMessageType.FRIENDSCHATNOTIFICATION.getType()); - if (ccInfoBuffer == null) { - continue; - } - ccInfoBuffer.removeMessageNode(messageNode); - removed = true; } - if (removed) { - this.clientThread.invoke(() -> this.client.runScript(216, new Object[0])); + + if (removed) + { + clientThread.invoke(() -> client.runScript(ScriptID.BUILD_CHATBOX)); } } - private void addClanActivityMessages() { - final Iterator activityIt = this.activityBuffer.values().iterator(); - while (activityIt.hasNext()) { - final ClanMemberActivity activity = activityIt.next(); - if (activity.getTick() < this.client.getTickCount() - 10) { + private void addClanActivityMessages() + { + Iterator activityIt = activityBuffer.values().iterator(); + + while (activityIt.hasNext()) + { + ClanMemberActivity activity = activityIt.next(); + + if (activity.getTick() < client.getTickCount() - MESSAGE_DELAY) + { activityIt.remove(); - this.addActivityMessage(activity.getMember(), activity.getActivityType()); + addActivityMessage(activity.getMember(), activity.getActivityType()); } } } - private void addActivityMessage(final ClanMember member, final ClanActivityType activityType) { - final String activityMessage = (activityType == ClanActivityType.JOINED) ? " has joined." : " has left."; + private void addActivityMessage(ClanMember member, ClanActivityType activityType) + { + final String activityMessage = activityType == ClanActivityType.JOINED ? " has joined." : " has left."; final ClanMemberRank rank = member.getRank(); - Color textColor = JagexColors.CHAT_CLAN_TEXT_OPAQUE_BACKGROUND; - Color channelColor = JagexColors.CHAT_CLAN_NAME_OPAQUE_BACKGROUND; + Color textColor = CHAT_CLAN_TEXT_OPAQUE_BACKGROUND; + Color channelColor = CHAT_CLAN_NAME_OPAQUE_BACKGROUND; int rankIcon = -1; - if (this.client.isResized() && this.client.getVar(Varbits.TRANSPARENT_CHATBOX) == 1) { - textColor = JagexColors.CHAT_CLAN_TEXT_TRANSPARENT_BACKGROUND; - channelColor = JagexColors.CHAT_CLAN_NAME_TRANSPARENT_BACKGROUND; + + if (client.isResized() && client.getVar(Varbits.TRANSPARENT_CHATBOX) == 1) + { + textColor = CHAT_CLAN_TEXT_TRANSPARENT_BACKGROUND; + channelColor = CHAT_CLAN_NAME_TRANSPARENT_BACKGROUND; } - if (this.config.clanChatIcons() && rank != null && rank != ClanMemberRank.UNRANKED) { - rankIcon = this.clanManager.getIconNumber(rank); + + if (config.clanChatIcons() && rank != null && rank != ClanMemberRank.UNRANKED) + { + rankIcon = clanManager.getIconNumber(rank); } - final ChatMessageBuilder message = new ChatMessageBuilder().append("[").append(channelColor, this.client.getClanChatName()); - if (rankIcon > -1) { - message.append(" ").img(rankIcon); + + ChatMessageBuilder message = new ChatMessageBuilder() + .append("[") + .append(channelColor, client.getClanChatName()); + if (rankIcon > -1) + { + message + .append(" ") + .img(rankIcon); } - message.append("] ").append(textColor, member.getUsername() + activityMessage); + message + .append("] ") + .append(textColor, member.getUsername() + activityMessage); + final String messageString = message.build(); - this.client.addChatMessage(ChatMessageType.FRIENDSCHATNOTIFICATION, "", messageString, ""); - final ChatLineBuffer chatLineBuffer = this.client.getChatLineMap().get(ChatMessageType.FRIENDSCHATNOTIFICATION.getType()); + client.addChatMessage(ChatMessageType.FRIENDSCHATNOTIFICATION, "", messageString, ""); + + final ChatLineBuffer chatLineBuffer = client.getChatLineMap().get(ChatMessageType.FRIENDSCHATNOTIFICATION.getType()); final MessageNode[] lines = chatLineBuffer.getLines(); final MessageNode line = lines[0]; - final ClanJoinMessage clanJoinMessage = new ClanJoinMessage(line, line.getId(), this.client.getTickCount()); - this.clanJoinMessages.addLast(clanJoinMessage); + + ClanJoinMessage clanJoinMessage = new ClanJoinMessage(line, line.getId(), client.getTickCount()); + clanJoinMessages.addLast(clanJoinMessage); } @Subscribe - public void onVarClientStrChanged(final VarClientStrChanged strChanged) { - if (strChanged.getIndex() == VarClientStr.RECENT_CLAN_CHAT.getIndex() && this.config.recentChats()) { - this.updateRecentChat(this.client.getVar(VarClientStr.RECENT_CLAN_CHAT)); + public void onVarClientStrChanged(VarClientStrChanged strChanged) + { + if (strChanged.getIndex() == VarClientStr.RECENT_CLAN_CHAT.getIndex() && config.recentChats()) + { + updateRecentChat(client.getVar(VarClientStr.RECENT_CLAN_CHAT)); } } @Subscribe - public void onChatMessage(final ChatMessage chatMessage) { - if (this.client.getGameState() != GameState.LOADING && this.client.getGameState() != GameState.LOGGED_IN) { + public void onChatMessage(ChatMessage chatMessage) + { + if (client.getGameState() != GameState.LOADING && client.getGameState() != GameState.LOGGED_IN) + { return; } - if (this.client.getClanChatCount() <= 0) { + + if (client.getClanChatCount() <= 0) + { return; } - switch (chatMessage.getType()) { + + switch (chatMessage.getType()) + { case PRIVATECHAT: - case MODPRIVATECHAT: { - if (!this.config.privateMessageIcons()) { + case MODPRIVATECHAT: + if (!config.privateMessageIcons()) + { return; } break; - } case PUBLICCHAT: - case MODCHAT: { - if (!this.config.publicChatIcons()) { + case MODCHAT: + if (!config.publicChatIcons()) + { return; } break; - } - case FRIENDSCHAT: { - if (!this.config.clanChatIcons()) { + case FRIENDSCHAT: + if (!config.clanChatIcons()) + { return; } break; - } - default: { + default: return; - } } - this.insertClanRankIcon(chatMessage); + + insertClanRankIcon(chatMessage); } @Subscribe - public void onGameStateChanged(final GameStateChanged state) { - final GameState gameState = state.getGameState(); - if (gameState == GameState.LOGIN_SCREEN || gameState == GameState.CONNECTION_LOST || gameState == GameState.HOPPING) { - ClanChatPlugin.clanMembers.clear(); - this.removeClanCounter(); - this.clanJoinMessages.clear(); + public void onGameStateChanged(GameStateChanged state) + { + GameState gameState = state.getGameState(); + + if (gameState == GameState.LOGIN_SCREEN || gameState == GameState.CONNECTION_LOST || gameState == GameState.HOPPING) + { + clanMembers.clear(); + removeClanCounter(); + + clanJoinMessages.clear(); } } @Subscribe - public void onPlayerSpawned(final PlayerSpawned event) { - if (event.getPlayer().isClanMember()) { - ClanChatPlugin.clanMembers.add(event.getPlayer()); - this.addClanCounter(); + public void onPlayerSpawned(PlayerSpawned event) + { + final Player local = client.getLocalPlayer(); + final Player player = event.getPlayer(); + + if (player != local && player.isClanMember()) + { + clanMembers.add(player); + addClanCounter(); } } @Subscribe - public void onPlayerDespawned(final PlayerDespawned event) { - if (ClanChatPlugin.clanMembers.remove(event.getPlayer()) && ClanChatPlugin.clanMembers.isEmpty()) { - this.removeClanCounter(); + public void onPlayerDespawned(PlayerDespawned event) + { + if (clanMembers.remove(event.getPlayer()) && clanMembers.isEmpty()) + { + removeClanCounter(); } } @Subscribe - public void onClanChanged(final ClanChanged event) { - if (event.isJoined()) { - this.clanJoinedTick = this.client.getTickCount(); + public void onClanChanged(ClanChanged event) + { + if (event.isJoined()) + { + clanJoinedTick = client.getTickCount(); } - else { - ClanChatPlugin.clanMembers.clear(); - this.removeClanCounter(); + else + { + clanMembers.clear(); + removeClanCounter(); } - this.activityBuffer.clear(); + + activityBuffer.clear(); } - int getClanAmount() { - return ClanChatPlugin.clanMembers.size(); + int getClanAmount() + { + return clanMembers.size(); } - private void insertClanRankIcon(final ChatMessage message) { - final ClanMemberRank rank = this.clanManager.getRank(message.getName()); - if (rank != null && rank != ClanMemberRank.UNRANKED) { - final int iconNumber = this.clanManager.getIconNumber(rank); + private void insertClanRankIcon(final ChatMessage message) + { + final ClanMemberRank rank = clanManager.getRank(message.getName()); + + if (rank != null && rank != ClanMemberRank.UNRANKED) + { + int iconNumber = clanManager.getIconNumber(rank); final String img = ""; - if (message.getType() == ChatMessageType.FRIENDSCHAT) { - message.getMessageNode().setSender(message.getMessageNode().getSender() + " " + img); + if (message.getType() == ChatMessageType.FRIENDSCHAT) + { + message.getMessageNode() + .setSender(message.getMessageNode().getSender() + " " + img); } - else { - message.getMessageNode().setName(img + message.getMessageNode().getName()); + else + { + message.getMessageNode() + .setName(img + message.getMessageNode().getName()); } - this.client.refreshChat(); + client.refreshChat(); } } - private void resetClanChats() { - final Widget clanChatList = this.client.getWidget(WidgetInfo.CLAN_CHAT_LIST); - final Widget clanChatTitleWidget = this.client.getWidget(WidgetInfo.CLAN_CHAT_TITLE); - if (clanChatList == null) { + private void resetClanChats() + { + Widget clanChatList = client.getWidget(WidgetInfo.CLAN_CHAT_LIST); + Widget clanChatTitleWidget = client.getWidget(WidgetInfo.CLAN_CHAT_TITLE); + + if (clanChatList == null) + { return; } - if (this.client.getClanChatCount() == 0) { + + if (client.getClanChatCount() == 0) + { clanChatList.setChildren(null); } - clanChatTitleWidget.setText("Clan Chat"); + + clanChatTitleWidget.setText(CLAN_CHAT_TITLE); } - private void loadClanChats() { - final Widget clanChatList = this.client.getWidget(WidgetInfo.CLAN_CHAT_LIST); - if (clanChatList == null) { + private void loadClanChats() + { + Widget clanChatList = client.getWidget(WidgetInfo.CLAN_CHAT_LIST); + if (clanChatList == null) + { return; } + int y = 2; clanChatList.setChildren(null); - for (final String chat : Lists.reverse(this.chats)) { - final Widget widget = clanChatList.createChild(-1, 4); + for (String chat : Lists.reverse(chats)) + { + Widget widget = clanChatList.createChild(-1, WidgetType.TEXT); widget.setFontId(494); - widget.setTextColor(16777215); + widget.setTextColor(0xffffff); widget.setText(chat); widget.setOriginalHeight(14); widget.setOriginalWidth(142); widget.setOriginalY(y); widget.setOriginalX(20); widget.revalidate(); + y += 14; } } - private void updateRecentChat(String s) { - if (Strings.isNullOrEmpty(s)) { + private void updateRecentChat(String s) + { + if (Strings.isNullOrEmpty(s)) + { return; } + s = Text.toJagexName(s); - final List chats = this.chats; - final String s2 = s; - Objects.requireNonNull(s2); - chats.removeIf(s2::equalsIgnoreCase); - this.chats.add(s); - while (this.chats.size() > 10) { - this.chats.remove(0); + + chats.removeIf(s::equalsIgnoreCase); + chats.add(s); + + while (chats.size() > MAX_CHATS) + { + chats.remove(0); } - this.config.chatsData(Text.toCSV(this.chats)); + + config.chatsData(Text.toCSV(chats)); } - private void removeClanCounter() { - this.infoBoxManager.removeInfoBox(this.clanMemberCounter); - this.clanMemberCounter = null; + private void removeClanCounter() + { + infoBoxManager.removeInfoBox(clanMemberCounter); + clanMemberCounter = null; } - private void addClanCounter() { - if (!this.config.showClanCounter() || this.clanMemberCounter != null || ClanChatPlugin.clanMembers.isEmpty()) { + private void addClanCounter() + { + if (!config.showClanCounter() || clanMemberCounter != null || clanMembers.isEmpty()) + { return; } - final BufferedImage image = this.spriteManager.getSprite(904, 0); - this.clanMemberCounter = new ClanChatIndicator(image, this); - this.infoBoxManager.addInfoBox(this.clanMemberCounter); - } - static { - ClanChatPlugin.clanMembers = new CopyOnWriteArrayList(); + final BufferedImage image = spriteManager.getSprite(SpriteID.TAB_CLAN_CHAT, 0); + clanMemberCounter = new ClanChatIndicator(image, this); + infoBoxManager.addInfoBox(clanMemberCounter); } } From 4f1a8db3576c39ebaa53df33fe388d98f33304bc Mon Sep 17 00:00:00 2001 From: trimbe Date: Sat, 20 Apr 2019 22:49:19 -0400 Subject: [PATCH 10/21] scripts: add quest list progress script --- .../main/scripts/QuestListShowProgress.hash | 1 + .../main/scripts/QuestListShowProgress.rs2asm | 196 ++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 runelite-client/src/main/scripts/QuestListShowProgress.hash create mode 100644 runelite-client/src/main/scripts/QuestListShowProgress.rs2asm diff --git a/runelite-client/src/main/scripts/QuestListShowProgress.hash b/runelite-client/src/main/scripts/QuestListShowProgress.hash new file mode 100644 index 0000000000..d3899f1431 --- /dev/null +++ b/runelite-client/src/main/scripts/QuestListShowProgress.hash @@ -0,0 +1 @@ +A6B3A7BFE7B688A08F69B91A7FD5C7184D71147D3DAF74B1262369D85DBB3A03 \ No newline at end of file diff --git a/runelite-client/src/main/scripts/QuestListShowProgress.rs2asm b/runelite-client/src/main/scripts/QuestListShowProgress.rs2asm new file mode 100644 index 0000000000..0f19883b4f --- /dev/null +++ b/runelite-client/src/main/scripts/QuestListShowProgress.rs2asm @@ -0,0 +1,196 @@ +.id 1354 +.int_stack_count 3 +.string_stack_count 0 +.int_var_count 7 +.string_var_count 0 + iconst 0 + istore 3 + iconst 0 + istore 4 + iconst 0 + istore 5 + invoke 1340 + istore 6 +LABEL8: + iload 5 + iload 6 + if_icmplt LABEL12 + jump LABEL56 +LABEL12: + iload 0 + iload 5 + cc_find + iconst 1 + if_icmpeq LABEL18 + jump LABEL51 +LABEL18: + iload 5 + invoke 1357 + istore 3 + iload 3 + iconst 2 + if_icmpeq LABEL25 + jump LABEL28 +LABEL25: + iconst 901389 + istore 4 + jump LABEL37 +LABEL28: + iload 3 + iconst 0 + if_icmpeq LABEL32 + jump LABEL35 +LABEL32: + iconst 16776960 + istore 4 + jump LABEL37 +LABEL35: + iconst 16711680 + istore 4 +LABEL37: + iload 4 + cc_setcolour + iconst 85 + iconst -2147483645 + iconst -2147483643 + iconst 16777215 + sconst "Iii" + cc_setonmouseover + iconst 85 + iconst -2147483645 + iconst -2147483643 + iload 4 + sconst "Iii" + cc_setonmouseleave +LABEL51: + iload 5 + iconst 1 + add + istore 5 + jump LABEL8 +LABEL56: + iconst 0 + invoke 2245 + istore 6 + istore 5 +LABEL60: + iload 5 + iload 6 + if_icmplt LABEL64 + jump LABEL108 +LABEL64: + iload 1 + iload 5 + cc_find + iconst 1 + if_icmpeq LABEL70 + jump LABEL103 +LABEL70: + iload 5 + invoke 1358 + istore 3 + iload 3 + iconst 2 + if_icmpeq LABEL77 + jump LABEL80 +LABEL77: + iconst 901389 + istore 4 + jump LABEL89 +LABEL80: + iload 3 + iconst 0 + if_icmpeq LABEL84 + jump LABEL87 +LABEL84: + iconst 16776960 + istore 4 + jump LABEL89 +LABEL87: + iconst 16711680 + istore 4 +LABEL89: + iload 4 + cc_setcolour + iconst 85 + iconst -2147483645 + iconst -2147483643 + iconst 16777215 + sconst "Iii" + cc_setonmouseover + iconst 85 + iconst -2147483645 + iconst -2147483643 + iload 4 + sconst "Iii" + cc_setonmouseleave +LABEL103: + iload 5 + iconst 1 + add + istore 5 + jump LABEL60 +LABEL108: + iconst 0 + invoke 2265 + istore 6 + istore 5 +LABEL112: + iload 5 + iload 6 + if_icmplt LABEL116 + jump LABEL160 +LABEL116: + iload 2 + iload 5 + cc_find + iconst 1 + if_icmpeq LABEL122 + jump LABEL155 +LABEL122: + iload 5 + invoke 1359 + istore 3 + iload 3 + iconst 2 + if_icmpeq LABEL129 + jump LABEL132 +LABEL129: + iconst 901389 + istore 4 + jump LABEL141 +LABEL132: + iload 3 + iconst 0 + if_icmpeq LABEL136 + jump LABEL139 +LABEL136: + iconst 16776960 + istore 4 + jump LABEL141 +LABEL139: + iconst 16711680 + istore 4 +LABEL141: + iload 4 + cc_setcolour + iconst 85 + iconst -2147483645 + iconst -2147483643 + iconst 16777215 + sconst "Iii" + cc_setonmouseover + iconst 85 + iconst -2147483645 + iconst -2147483643 + iload 4 + sconst "Iii" + cc_setonmouseleave +LABEL155: + iload 5 + iconst 1 + add + istore 5 + jump LABEL112 +LABEL160: + return From 5807d383040fac67d9501688128b89f6a222efb4 Mon Sep 17 00:00:00 2001 From: trimbe Date: Sat, 20 Apr 2019 22:49:46 -0400 Subject: [PATCH 11/21] quest list plugin: use progress script to trigger hiding quests --- .../plugins/questlist/QuestListPlugin.java | 91 ++++++++++--------- .../main/scripts/QuestListShowProgress.rs2asm | 2 + 2 files changed, 49 insertions(+), 44 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java index fdc05403df..2ebf2a4318 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java @@ -36,12 +36,11 @@ import net.runelite.api.SpriteID; import net.runelite.api.VarClientInt; import net.runelite.api.Varbits; import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.VarClientIntChanged; import net.runelite.api.events.VarbitChanged; -import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.JavaScriptCallback; import net.runelite.api.widgets.Widget; -import net.runelite.api.widgets.WidgetID; import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetPositionMode; import net.runelite.api.widgets.WidgetType; @@ -104,46 +103,45 @@ public class QuestListPlugin extends Plugin } @Subscribe - public void onWidgetLoaded(WidgetLoaded widgetLoaded) + public void onScriptCallbackEvent(ScriptCallbackEvent event) { - if (widgetLoaded.getGroupId() == WidgetID.QUESTLIST_GROUP_ID) + if (!event.getEventName().equals("questProgressUpdated")) { - Widget header = client.getWidget(WidgetInfo.QUESTLIST_BOX); - if (header != null) - { - questSearchButton = header.createChild(-1, WidgetType.GRAPHIC); - questSearchButton.setSpriteId(SpriteID.GE_SEARCH); - questSearchButton.setOriginalWidth(18); - questSearchButton.setOriginalHeight(17); - questSearchButton.setXPositionMode(WidgetPositionMode.ABSOLUTE_RIGHT); - questSearchButton.setOriginalX(5); - questSearchButton.setOriginalY(0); - questSearchButton.setHasListener(true); - questSearchButton.setAction(1, MENU_OPEN); - questSearchButton.setOnOpListener((JavaScriptCallback) e -> openSearch()); - questSearchButton.setName(MENU_SEARCH); - questSearchButton.revalidate(); + return; + } - questHideButton = header.createChild(-1, WidgetType.GRAPHIC); - redrawHideButton(); + Widget header = client.getWidget(WidgetInfo.QUESTLIST_BOX); + if (header != null) + { + questSearchButton = header.createChild(-1, WidgetType.GRAPHIC); + questSearchButton.setSpriteId(SpriteID.GE_SEARCH); + questSearchButton.setOriginalWidth(18); + questSearchButton.setOriginalHeight(17); + questSearchButton.setXPositionMode(WidgetPositionMode.ABSOLUTE_RIGHT); + questSearchButton.setOriginalX(5); + questSearchButton.setOriginalY(0); + questSearchButton.setHasListener(true); + questSearchButton.setAction(1, MENU_OPEN); + questSearchButton.setOnOpListener((JavaScriptCallback) e -> openSearch()); + questSearchButton.setName(MENU_SEARCH); + questSearchButton.revalidate(); - questHideButton.setOriginalWidth(13); - questHideButton.setOriginalHeight(13); - questHideButton.setXPositionMode(WidgetPositionMode.ABSOLUTE_RIGHT); - questHideButton.setOriginalX(24); - questHideButton.setOriginalY(2); - questHideButton.setHasListener(true); - questHideButton.setOnOpListener((JavaScriptCallback) e -> toggleHidden()); - questHideButton.setAction(1, MENU_TOGGLE); - questHideButton.revalidate(); + questHideButton = header.createChild(-1, WidgetType.GRAPHIC); + redrawHideButton(); - questSet = new EnumMap<>(QuestContainer.class); + questHideButton.setOriginalWidth(13); + questHideButton.setOriginalHeight(13); + questHideButton.setXPositionMode(WidgetPositionMode.ABSOLUTE_RIGHT); + questHideButton.setOriginalX(24); + questHideButton.setOriginalY(2); + questHideButton.setHasListener(true); + questHideButton.setOnOpListener((JavaScriptCallback) e -> toggleHidden()); + questHideButton.setAction(1, MENU_TOGGLE); + questHideButton.revalidate(); - if (!header.isHidden()) - { - updateFilter(); - } - } + questSet = new EnumMap<>(QuestContainer.class); + + updateFilter(); } } @@ -259,21 +257,26 @@ public class QuestListPlugin extends Plugin int y = miniList.getRelativeY() + miniList.getHeight() + 10; - int newHeight = 0; + int newHeight; if (container.getScrollHeight() > 0) { newHeight = (container.getScrollY() * y) / container.getScrollHeight(); } + else + { + newHeight = 0; + } container.setScrollHeight(y); container.revalidateScroll(); - client.runScript( - ScriptID.UPDATE_SCROLLBAR, - WidgetInfo.QUESTLIST_SCROLLBAR.getId(), - WidgetInfo.QUESTLIST_CONTAINER.getId(), - newHeight - ); + clientThread.invokeLater(() -> + client.runScript( + ScriptID.UPDATE_SCROLLBAR, + WidgetInfo.QUESTLIST_SCROLLBAR.getId(), + WidgetInfo.QUESTLIST_CONTAINER.getId(), + newHeight + )); } private void updateList(QuestContainer questContainer, String filter) @@ -309,7 +312,7 @@ public class QuestListPlugin extends Plugin // Find all of the widgets that we care about, sorting by their Y value quests = Arrays.stream(list.getDynamicChildren()) .sorted(Comparator.comparing(Widget::getRelativeY)) - .filter(w -> !w.isSelfHidden() && !QUEST_HEADERS.contains(w.getText())) + .filter(w -> !QUEST_HEADERS.contains(w.getText())) .map(w -> new QuestWidget(w, Text.removeTags(w.getText()).toLowerCase())) .collect(Collectors.toList()); questSet.put(questContainer, quests); diff --git a/runelite-client/src/main/scripts/QuestListShowProgress.rs2asm b/runelite-client/src/main/scripts/QuestListShowProgress.rs2asm index 0f19883b4f..f7f91cd83e 100644 --- a/runelite-client/src/main/scripts/QuestListShowProgress.rs2asm +++ b/runelite-client/src/main/scripts/QuestListShowProgress.rs2asm @@ -193,4 +193,6 @@ LABEL155: istore 5 jump LABEL112 LABEL160: + sconst "questProgressUpdated" + runelite_callback return From dde0c0a235013e110b9258e3d7f9c2a88e263284 Mon Sep 17 00:00:00 2001 From: xDemoN Date: Sun, 21 Apr 2019 19:44:25 -0400 Subject: [PATCH 12/21] add lv32 wildy hot cold clue location --- .../plugins/cluescrolls/clues/hotcold/HotColdLocation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java index bf9d40bac9..c145a7281c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java @@ -145,6 +145,7 @@ public enum HotColdLocation WILDERNESS_20(new WorldPoint(3225, 3676, 0), WILDERNESS, "East of the Corporeal Beast's lair, level 20 Wilderness."), WILDERNESS_27(new WorldPoint(3174, 3735, 0), WILDERNESS, "North-west of the Corporeal Beast cave, in the ruins at level 27 Wilderness."), WILDERNESS_28(new WorldPoint(3374, 3734, 0), WILDERNESS, "East of Venenatis' nest, level 28 Wilderness."), + WILDERNESS_32(new WorldPoint(3311, 3773, 0), WILDERNESS, "North of Venenatis' nest, level 32 Wilderness."), WILDERNESS_35(new WorldPoint(3153, 3795, 0), WILDERNESS, "East of the Wilderness canoe exit, level 35 Wilderness."), WILDERNESS_37(new WorldPoint(2975, 3811, 0), WILDERNESS, "South-east of the Chaos Temple, level 37 Wilderness."), WILDERNESS_38(new WorldPoint(3294, 3817, 0), WILDERNESS, "South of Callisto, level 38 Wilderness."), From 38bb5ca6099bf0e8cc418c770adbea9f712fd21a Mon Sep 17 00:00:00 2001 From: xDemoN Date: Sun, 21 Apr 2019 19:45:57 -0400 Subject: [PATCH 13/21] reword lv27 wildy hot cold clue location to match the description on osrs.wiki --- .../plugins/cluescrolls/clues/hotcold/HotColdLocation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java index c145a7281c..b6c6fa2a43 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java @@ -143,7 +143,7 @@ public enum HotColdLocation WILDERNESS_5(new WorldPoint(3169, 3558, 0), WILDERNESS, "North of the Grand Exchange, level 5 Wilderness."), WILDERNESS_12(new WorldPoint(3038, 3612, 0), WILDERNESS, "South-east of the Dark Warriors' Fortress, level 12 Wilderness."), WILDERNESS_20(new WorldPoint(3225, 3676, 0), WILDERNESS, "East of the Corporeal Beast's lair, level 20 Wilderness."), - WILDERNESS_27(new WorldPoint(3174, 3735, 0), WILDERNESS, "North-west of the Corporeal Beast cave, in the ruins at level 27 Wilderness."), + WILDERNESS_27(new WorldPoint(3174, 3735, 0), WILDERNESS, "Inside the Ruins north of the Graveyard of Shadows, level 27 Wilderness."), WILDERNESS_28(new WorldPoint(3374, 3734, 0), WILDERNESS, "East of Venenatis' nest, level 28 Wilderness."), WILDERNESS_32(new WorldPoint(3311, 3773, 0), WILDERNESS, "North of Venenatis' nest, level 32 Wilderness."), WILDERNESS_35(new WorldPoint(3153, 3795, 0), WILDERNESS, "East of the Wilderness canoe exit, level 35 Wilderness."), From 1c5f64f336fe6c613f2444dced91fb6dfad018da Mon Sep 17 00:00:00 2001 From: JacobThompson Date: Mon, 22 Apr 2019 20:42:13 -0500 Subject: [PATCH 14/21] Update lap counter overlay strings for clarity. Removed slang "till'" from the lap counter overlay string and added colons to the end for cleanliness and aesthetic. --- .../runelite/client/plugins/agility/LapCounterOverlay.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java index c3da7a62f2..b6da44d76a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java @@ -81,14 +81,14 @@ class LapCounterOverlay extends Overlay panelComponent.getChildren().clear(); panelComponent.getChildren().add(LineComponent.builder() - .left("Total Laps") + .left("Total Laps:") .right(Integer.toString(session.getTotalLaps())) .build()); if (session.getLapsTillLevel() > 0) { panelComponent.getChildren().add(LineComponent.builder() - .left("Laps till level") + .left("Laps until level:") .right(Integer.toString(session.getLapsTillLevel())) .build()); } From 3be1c41cb9b2c06683efbe4e8e7a2297faaad1a9 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Tue, 23 Apr 2019 12:38:17 -0700 Subject: [PATCH 15/21] WorldType: Fix HIGH_RISK world type name This world type is not specifically a PVP world type; at the time of this commit, world 365 is a non-PVP high-risk world, where the world is the same as a regular members' world, except that the Protect Item prayer is disabled. --- .../main/java/net/runelite/http/api/worlds/WorldType.java | 2 +- .../net/runelite/http/service/worlds/ServiceWorldType.java | 2 +- runelite-api/src/main/java/net/runelite/api/WorldType.java | 6 +++--- .../net/runelite/client/plugins/discord/DiscordPlugin.java | 2 +- .../client/plugins/worldhopper/WorldHopperPlugin.java | 2 +- .../runelite/client/plugins/worldhopper/WorldTableRow.java | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/http-api/src/main/java/net/runelite/http/api/worlds/WorldType.java b/http-api/src/main/java/net/runelite/http/api/worlds/WorldType.java index 3bea0a4cbc..c94a7c70e6 100644 --- a/http-api/src/main/java/net/runelite/http/api/worlds/WorldType.java +++ b/http-api/src/main/java/net/runelite/http/api/worlds/WorldType.java @@ -30,7 +30,7 @@ public enum WorldType PVP, BOUNTY, SKILL_TOTAL, - PVP_HIGH_RISK, + HIGH_RISK, LAST_MAN_STANDING, TOURNAMENT, DEADMAN, diff --git a/http-service/src/main/java/net/runelite/http/service/worlds/ServiceWorldType.java b/http-service/src/main/java/net/runelite/http/service/worlds/ServiceWorldType.java index 1a3c1271f9..c6aa598321 100644 --- a/http-service/src/main/java/net/runelite/http/service/worlds/ServiceWorldType.java +++ b/http-service/src/main/java/net/runelite/http/service/worlds/ServiceWorldType.java @@ -32,7 +32,7 @@ enum ServiceWorldType PVP(WorldType.PVP, 1 << 2), BOUNTY(WorldType.BOUNTY, 1 << 5), SKILL_TOTAL(WorldType.SKILL_TOTAL, 1 << 7), - PVP_HIGH_RISK(WorldType.PVP_HIGH_RISK, 1 << 10), + HIGH_RISK(WorldType.HIGH_RISK, 1 << 10), LAST_MAN_STANDING(WorldType.LAST_MAN_STANDING, 1 << 14), TOURNAMENT(WorldType.TOURNAMENT, 1 << 25), DEADMAN_TOURNAMENT(WorldType.DEADMAN_TOURNAMENT, 1 << 26), diff --git a/runelite-api/src/main/java/net/runelite/api/WorldType.java b/runelite-api/src/main/java/net/runelite/api/WorldType.java index b22bc17fb3..8929691be0 100644 --- a/runelite-api/src/main/java/net/runelite/api/WorldType.java +++ b/runelite-api/src/main/java/net/runelite/api/WorldType.java @@ -49,9 +49,9 @@ public enum WorldType */ SKILL_TOTAL(1 << 7), /** - * Pvp high risk world type. + * High risk world type. */ - PVP_HIGH_RISK(1 << 10), + HIGH_RISK(1 << 10), /** * Last man standing world type. */ @@ -84,7 +84,7 @@ public enum WorldType DEADMAN, DEADMAN_TOURNAMENT, PVP, - PVP_HIGH_RISK, + HIGH_RISK, SEASONAL_DEADMAN ); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java index 9598b7eff5..c5a86c6df2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java @@ -409,7 +409,7 @@ public class DiscordPlugin extends Plugin if (worldType.contains(WorldType.SEASONAL_DEADMAN) || worldType.contains(WorldType.DEADMAN) || worldType.contains(WorldType.PVP) || - worldType.contains(WorldType.PVP_HIGH_RISK)) + worldType.contains(WorldType.HIGH_RISK)) { return false; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java index f541ab2152..9a56f6eeab 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java @@ -554,7 +554,7 @@ public class WorldHopperPlugin extends Plugin if (config.quickhopOutOfDanger()) { currentWorldTypes.remove(WorldType.PVP); - currentWorldTypes.remove(WorldType.PVP_HIGH_RISK); + currentWorldTypes.remove(WorldType.HIGH_RISK); } // Don't regard these worlds as a type that must be hopped between currentWorldTypes.remove(WorldType.BOUNTY); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java index a497da60e7..a450c36b89 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java @@ -245,7 +245,7 @@ class WorldTableRow extends JPanel return; } else if (world.getTypes().contains(WorldType.PVP) - || world.getTypes().contains(WorldType.PVP_HIGH_RISK) + || world.getTypes().contains(WorldType.HIGH_RISK) || world.getTypes().contains(WorldType.DEADMAN) || world.getTypes().contains(WorldType.SEASONAL_DEADMAN)) { From 48d428edf541bdaf7b6cc437e62b24997006129c Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Tue, 23 Apr 2019 12:40:43 -0700 Subject: [PATCH 16/21] Remove PVP references to HIGH_RISK world type As described in 5bebd34bb, HIGH_RISK is not a PVP world type. Note: this will not affect the world hopper plugin, as it both explicitly references the high risk world type, and references the http-api WorldType implementation, not the runelite-api WorldType which is being modified in this commit. Fixes runelite/runelite#8605 Fixes runelite/runelite#8624 --- runelite-api/src/main/java/net/runelite/api/WorldType.java | 1 - .../net/runelite/client/plugins/discord/DiscordPlugin.java | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/WorldType.java b/runelite-api/src/main/java/net/runelite/api/WorldType.java index 8929691be0..0ecfd1ed94 100644 --- a/runelite-api/src/main/java/net/runelite/api/WorldType.java +++ b/runelite-api/src/main/java/net/runelite/api/WorldType.java @@ -84,7 +84,6 @@ public enum WorldType DEADMAN, DEADMAN_TOURNAMENT, PVP, - HIGH_RISK, SEASONAL_DEADMAN ); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java index c5a86c6df2..443dd8ac12 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java @@ -406,10 +406,7 @@ public class DiscordPlugin extends Plugin final EnumSet worldType = client.getWorldType(); // Do not show location in PVP activities - if (worldType.contains(WorldType.SEASONAL_DEADMAN) || - worldType.contains(WorldType.DEADMAN) || - worldType.contains(WorldType.PVP) || - worldType.contains(WorldType.HIGH_RISK)) + if (WorldType.isPvpWorld(worldType)) { return false; } From 62d99c1d3e37ae00eaa0065788e1dbf88d00aa2e Mon Sep 17 00:00:00 2001 From: Elliott Date: Tue, 23 Apr 2019 17:38:13 -0400 Subject: [PATCH 17/21] fishing plugin: add trawler timer Co-authored-by: Adam --- .../net/runelite/api/widgets/WidgetID.java | 1 + .../net/runelite/api/widgets/WidgetInfo.java | 2 + .../client/plugins/fishing/FishingConfig.java | 11 +++ .../client/plugins/fishing/FishingPlugin.java | 74 ++++++++++++++++++- 4 files changed, 87 insertions(+), 1 deletion(-) diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index ffd20e7eb9..bb10df74ad 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -121,6 +121,7 @@ public class WidgetID public static final int MINIGAME_TAB_ID = 76; public static final int SPELLBOOK_GROUP_ID = 218; public static final int PVP_GROUP_ID = 90; + public static final int FISHING_TRAWLER_GROUP_ID = 366; public static final int ZEAH_MESS_HALL_GROUP_ID = 235; public static final int KOUREND_FAVOUR_GROUP_ID = 246; public static final int LOOTING_BAG_GROUP_ID = 81; diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index 579007c2f4..1bff89b327 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -420,6 +420,8 @@ public enum WidgetInfo EXPERIENCE_TRACKER_WIDGET(WidgetID.EXPERIENCE_TRACKER_GROUP_ID, WidgetID.ExperienceTracker.WIDGET), EXPERIENCE_TRACKER_BOTTOM_BAR(WidgetID.EXPERIENCE_TRACKER_GROUP_ID, WidgetID.ExperienceTracker.BOTTOM_BAR), + FISHING_TRAWLER_TIMER(WidgetID.FISHING_TRAWLER_GROUP_ID, 37), + TITHE_FARM(WidgetID.TITHE_FARM_GROUP_ID, 1), BARROWS_INFO(WidgetID.BARROWS_GROUP_ID, 0), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java index 17cb508a12..01d7454e4a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java @@ -118,4 +118,15 @@ public interface FishingConfig extends Config { return true; } + + @ConfigItem( + position = 8, + keyName = "trawlerTimer", + name = "Trawler timer in MM:SS", + description = "Trawler Timer will display a more accurate timer in MM:SS format." + ) + default boolean trawlerTimer() + { + return true; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java index b9144a300f..d27886c1aa 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java @@ -57,6 +57,10 @@ import net.runelite.api.events.ItemContainerChanged; import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.NpcSpawned; import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -78,9 +82,11 @@ public class FishingPlugin extends Plugin { private static final int TRAWLER_SHIP_REGION_NORMAL = 7499; private static final int TRAWLER_SHIP_REGION_SINKING = 8011; - + private static final int TRAWLER_TIME_LIMIT_IN_SECONDS = 614; private static final int TRAWLER_ACTIVITY_THRESHOLD = Math.round(0.15f * 255); + private Instant trawlerStartTime; + @Getter(AccessLevel.PACKAGE) private final FishingSession session = new FishingSession(); @@ -142,6 +148,7 @@ public class FishingPlugin extends Plugin minnowSpots.clear(); trawlerNotificationSent = false; currentSpot = null; + trawlerStartTime = null; } @Subscribe @@ -296,6 +303,11 @@ public class FishingPlugin extends Plugin } } } + + if (config.trawlerTimer()) + { + updateTrawlerTimer(); + } } @Subscribe @@ -351,6 +363,66 @@ public class FishingPlugin extends Plugin } } + @Subscribe + public void onWidgetLoaded(WidgetLoaded event) + { + if (event.getGroupId() == WidgetID.FISHING_TRAWLER_GROUP_ID) + { + trawlerStartTime = Instant.now(); + } + } + + /** + * Changes the Fishing Trawler timer widget from minutes to minutes and seconds + */ + private void updateTrawlerTimer() + { + if (trawlerStartTime == null) + { + return; + } + + int regionID = client.getLocalPlayer().getWorldLocation().getRegionID(); + if (regionID != TRAWLER_SHIP_REGION_NORMAL && regionID != TRAWLER_SHIP_REGION_SINKING) + { + log.debug("Trawler session ended"); + return; + } + + Widget trawlerTimerWidget = client.getWidget(WidgetInfo.FISHING_TRAWLER_TIMER); + if (trawlerTimerWidget == null) + { + return; + } + + long timeLeft = TRAWLER_TIME_LIMIT_IN_SECONDS - Duration.between(trawlerStartTime, Instant.now()).getSeconds(); + int minutes = (int) timeLeft / 60; + int seconds = (int) timeLeft % 60; + + final StringBuilder trawlerText = new StringBuilder(); + trawlerText.append("Time Left: "); + + if (minutes > 0) + { + trawlerText.append(minutes); + } + else + { + trawlerText.append("00"); + } + + trawlerText.append(':'); + + if (seconds < 10) + { + trawlerText.append("0"); + } + + trawlerText.append(seconds); + + trawlerTimerWidget.setText(trawlerText.toString()); + } + private void inverseSortSpotDistanceFromPlayer() { final LocalPoint cameraPoint = new LocalPoint(client.getCameraX(), client.getCameraY()); From b37539ad18856cee7afd5648b1e2baf23200fac7 Mon Sep 17 00:00:00 2001 From: BrianAllred Date: Wed, 24 Apr 2019 07:42:52 -0500 Subject: [PATCH 18/21] npc aggro timer: Add option to hide hint overlay (#8610) Closes #8589 --- .../plugins/npcunaggroarea/NpcAggroAreaConfig.java | 9 ++++----- .../npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java | 6 ++++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaConfig.java index 311e286b0b..99084a9172 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaConfig.java @@ -37,7 +37,6 @@ public interface NpcAggroAreaConfig extends Config String CONFIG_CENTER2 = "center2"; String CONFIG_LOCATION = "location"; String CONFIG_DURATION = "duration"; - String CONFIG_NOT_WORKING_OVERLAY = "overlay"; @ConfigItem( keyName = "npcUnaggroAlwaysActive", @@ -96,12 +95,12 @@ public interface NpcAggroAreaConfig extends Config @ConfigItem( keyName = "npcUnaggroShowNotWorkingOverlay", - name = "Show not working hint", - description = "Show hint if plugin is enabled in unsupported area", + name = "Hide overlay hint", + description = "Hide overlay hint if plugin is enabled in unsupported area", position = 6 ) - default boolean showNotWorkingOverlay() + default boolean hideOverlayHint() { - return true; + return false; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java index 0a9dedb357..3d238cce85 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java @@ -36,12 +36,14 @@ import net.runelite.client.ui.overlay.components.PanelComponent; class NpcAggroAreaNotWorkingOverlay extends Overlay { private final NpcAggroAreaPlugin plugin; + private final NpcAggroAreaConfig config; private final PanelComponent panelComponent; @Inject - private NpcAggroAreaNotWorkingOverlay(NpcAggroAreaPlugin plugin) + private NpcAggroAreaNotWorkingOverlay(NpcAggroAreaPlugin plugin, NpcAggroAreaConfig config) { this.plugin = plugin; + this.config = config; panelComponent = new PanelComponent(); panelComponent.setPreferredSize(new Dimension(150, 0)); @@ -56,7 +58,7 @@ class NpcAggroAreaNotWorkingOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (!plugin.isActive() || plugin.getSafeCenters()[1] != null) + if (!plugin.isActive() || plugin.getSafeCenters()[1] != null || config.hideOverlayHint()) { return null; } From 01dfa4f97337c0a7ff4bb1f413fae270f6ca349c Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Wed, 24 Apr 2019 23:44:26 +0200 Subject: [PATCH 19/21] Add missing 'knows' to Hans beginner clue Signed-off-by: Tomas Slusny --- .../runelite/client/plugins/cluescrolls/clues/CrypticClue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java index 4fdc6efa09..9180d6f007 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java @@ -303,7 +303,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc new CrypticClue("Search the drawers, upstairs in the bank to the East of Varrock.", DRAWERS_7194, new WorldPoint(3250, 3420, 1), "Search the drawers upstairs in Varrock east bank."), new CrypticClue("Speak to Hazelmere.", "Hazelmere", new WorldPoint(2677, 3088, 1), "Located upstairs in the house to the north of fairy ring CLS. Answer: 6859"), new CrypticClue("The effects of this fire are magnified.", new WorldPoint(1179, 3626, 0), "Dig by the fire beside Ket'sal K'uk in the westernmost part of the Kebos Swamp. "), - new CrypticClue("Always walking around the castle grounds and somehow everyone's age.", "Hans", new WorldPoint(3221, 3218, 0), "Talk to Hans walking around Lumbridge Castle."), + new CrypticClue("Always walking around the castle grounds and somehow knows everyone's age.", "Hans", new WorldPoint(3221, 3218, 0), "Talk to Hans walking around Lumbridge Castle."), new CrypticClue("In the place Duke Horacio calls home, talk to a man with a hat dropped by goblins.", "Cook", new WorldPoint(3208, 3213, 0), "Talk to the Cook in Lumbridge Castle."), new CrypticClue("In a village of barbarians, I am the one who guards the village from up high.", "Hunding", new WorldPoint(3097, 3432, 2), "Talk to Hunding atop the tower on the east side of Barbarian Village."), new CrypticClue("Talk to Charlie the Tramp in Varrock.", "Charlie the Tramp", new WorldPoint(3209, 3390, 0), "Talk to Charlie the Tramp by the southern entrance to Varrock. He will give you a task."), From fba19cd0416d920ab75852ca70598e29cfb8e7a3 Mon Sep 17 00:00:00 2001 From: Ganom Date: Wed, 24 Apr 2019 20:14:07 -0400 Subject: [PATCH 20/21] Update npc aggro plugin --- .../plugins/npcunaggroarea/NpcAggroAreaPlugin.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java index 10dd5752f9..75ebd40228 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java @@ -128,7 +128,6 @@ public class NpcAggroAreaPlugin extends Plugin private WorldPoint previousUnknownCenter; private boolean loggingIn; private List npcNamePatterns; - private boolean notWorkingOverlayShown = false; @Provides NpcAggroAreaConfig provideConfig(ConfigManager configManager) @@ -140,12 +139,7 @@ public class NpcAggroAreaPlugin extends Plugin protected void startUp() throws Exception { overlayManager.add(overlay); - if (config.showNotWorkingOverlay()) - { overlayManager.add(notWorkingOverlay); - notWorkingOverlayShown = true; - } - npcNamePatterns = NAME_SPLITTER.splitToList(config.npcNamePatterns()); recheckActive(); } @@ -155,11 +149,7 @@ public class NpcAggroAreaPlugin extends Plugin { removeTimer(); overlayManager.remove(overlay); - if (notWorkingOverlayShown) - { overlayManager.remove(notWorkingOverlay); - } - Arrays.fill(safeCenters, null); lastPlayerLocation = null; currentTimer = null; @@ -416,7 +406,6 @@ public class NpcAggroAreaPlugin extends Plugin configManager.unsetConfiguration(NpcAggroAreaConfig.CONFIG_GROUP, NpcAggroAreaConfig.CONFIG_CENTER2); configManager.unsetConfiguration(NpcAggroAreaConfig.CONFIG_GROUP, NpcAggroAreaConfig.CONFIG_LOCATION); configManager.unsetConfiguration(NpcAggroAreaConfig.CONFIG_GROUP, NpcAggroAreaConfig.CONFIG_DURATION); - configManager.unsetConfiguration(NpcAggroAreaConfig.CONFIG_GROUP, NpcAggroAreaConfig.CONFIG_NOT_WORKING_OVERLAY); } private void saveConfig() From 0f1c5046531c2624fa562c4abb5447df9e711cf6 Mon Sep 17 00:00:00 2001 From: James <38226001+james-munson@users.noreply.github.com> Date: Wed, 24 Apr 2019 17:17:06 -0700 Subject: [PATCH 21/21] Revert "Update" --- .../runelite/http/api/worlds/WorldType.java | 2 +- .../http/service/worlds/ServiceWorldType.java | 2 +- .../main/java/net/runelite/api/WorldType.java | 5 +- .../net/runelite/api/widgets/WidgetID.java | 1 - .../net/runelite/api/widgets/WidgetInfo.java | 2 - .../plugins/agility/LapCounterOverlay.java | 4 +- .../plugins/clanchat/ClanChatPlugin.java | 633 ++++++------------ .../cluescrolls/clues/CrypticClue.java | 2 +- .../clues/hotcold/HotColdLocation.java | 3 +- .../client/plugins/discord/DiscordPlugin.java | 5 +- .../client/plugins/fishing/FishingConfig.java | 11 - .../client/plugins/fishing/FishingPlugin.java | 74 +- .../npcunaggroarea/NpcAggroAreaConfig.java | 9 +- .../NpcAggroAreaNotWorkingOverlay.java | 6 +- .../npcunaggroarea/NpcAggroAreaPlugin.java | 11 + .../plugins/questlist/QuestListPlugin.java | 91 ++- .../worldhopper/WorldHopperPlugin.java | 2 +- .../plugins/worldhopper/WorldTableRow.java | 2 +- .../main/scripts/QuestListShowProgress.hash | 1 - .../main/scripts/QuestListShowProgress.rs2asm | 198 ------ 20 files changed, 297 insertions(+), 767 deletions(-) delete mode 100644 runelite-client/src/main/scripts/QuestListShowProgress.hash delete mode 100644 runelite-client/src/main/scripts/QuestListShowProgress.rs2asm diff --git a/http-api/src/main/java/net/runelite/http/api/worlds/WorldType.java b/http-api/src/main/java/net/runelite/http/api/worlds/WorldType.java index c94a7c70e6..3bea0a4cbc 100644 --- a/http-api/src/main/java/net/runelite/http/api/worlds/WorldType.java +++ b/http-api/src/main/java/net/runelite/http/api/worlds/WorldType.java @@ -30,7 +30,7 @@ public enum WorldType PVP, BOUNTY, SKILL_TOTAL, - HIGH_RISK, + PVP_HIGH_RISK, LAST_MAN_STANDING, TOURNAMENT, DEADMAN, diff --git a/http-service/src/main/java/net/runelite/http/service/worlds/ServiceWorldType.java b/http-service/src/main/java/net/runelite/http/service/worlds/ServiceWorldType.java index c6aa598321..1a3c1271f9 100644 --- a/http-service/src/main/java/net/runelite/http/service/worlds/ServiceWorldType.java +++ b/http-service/src/main/java/net/runelite/http/service/worlds/ServiceWorldType.java @@ -32,7 +32,7 @@ enum ServiceWorldType PVP(WorldType.PVP, 1 << 2), BOUNTY(WorldType.BOUNTY, 1 << 5), SKILL_TOTAL(WorldType.SKILL_TOTAL, 1 << 7), - HIGH_RISK(WorldType.HIGH_RISK, 1 << 10), + PVP_HIGH_RISK(WorldType.PVP_HIGH_RISK, 1 << 10), LAST_MAN_STANDING(WorldType.LAST_MAN_STANDING, 1 << 14), TOURNAMENT(WorldType.TOURNAMENT, 1 << 25), DEADMAN_TOURNAMENT(WorldType.DEADMAN_TOURNAMENT, 1 << 26), diff --git a/runelite-api/src/main/java/net/runelite/api/WorldType.java b/runelite-api/src/main/java/net/runelite/api/WorldType.java index 0ecfd1ed94..b22bc17fb3 100644 --- a/runelite-api/src/main/java/net/runelite/api/WorldType.java +++ b/runelite-api/src/main/java/net/runelite/api/WorldType.java @@ -49,9 +49,9 @@ public enum WorldType */ SKILL_TOTAL(1 << 7), /** - * High risk world type. + * Pvp high risk world type. */ - HIGH_RISK(1 << 10), + PVP_HIGH_RISK(1 << 10), /** * Last man standing world type. */ @@ -84,6 +84,7 @@ public enum WorldType DEADMAN, DEADMAN_TOURNAMENT, PVP, + PVP_HIGH_RISK, SEASONAL_DEADMAN ); diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index bb10df74ad..ffd20e7eb9 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -121,7 +121,6 @@ public class WidgetID public static final int MINIGAME_TAB_ID = 76; public static final int SPELLBOOK_GROUP_ID = 218; public static final int PVP_GROUP_ID = 90; - public static final int FISHING_TRAWLER_GROUP_ID = 366; public static final int ZEAH_MESS_HALL_GROUP_ID = 235; public static final int KOUREND_FAVOUR_GROUP_ID = 246; public static final int LOOTING_BAG_GROUP_ID = 81; diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index 1bff89b327..579007c2f4 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -420,8 +420,6 @@ public enum WidgetInfo EXPERIENCE_TRACKER_WIDGET(WidgetID.EXPERIENCE_TRACKER_GROUP_ID, WidgetID.ExperienceTracker.WIDGET), EXPERIENCE_TRACKER_BOTTOM_BAR(WidgetID.EXPERIENCE_TRACKER_GROUP_ID, WidgetID.ExperienceTracker.BOTTOM_BAR), - FISHING_TRAWLER_TIMER(WidgetID.FISHING_TRAWLER_GROUP_ID, 37), - TITHE_FARM(WidgetID.TITHE_FARM_GROUP_ID, 1), BARROWS_INFO(WidgetID.BARROWS_GROUP_ID, 0), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java index b6da44d76a..c3da7a62f2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java @@ -81,14 +81,14 @@ class LapCounterOverlay extends Overlay panelComponent.getChildren().clear(); panelComponent.getChildren().add(LineComponent.builder() - .left("Total Laps:") + .left("Total Laps") .right(Integer.toString(session.getTotalLaps())) .build()); if (session.getLapsTillLevel() > 0) { panelComponent.getChildren().add(LineComponent.builder() - .left("Laps until level:") + .left("Laps till level") .right(Integer.toString(session.getLapsTillLevel())) .build()); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java index 3f46869425..f52ebd7260 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java @@ -1,89 +1,30 @@ -/* - * Copyright (c) 2017, Devin French - * Copyright (c) 2019, Adam - * Copyright (c) 2018, trimbe - * 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.clanchat; -import com.google.common.base.Strings; -import com.google.common.collect.Lists; -import com.google.inject.Provides; -import java.awt.Color; -import java.awt.image.BufferedImage; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Deque; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import javax.inject.Inject; -import net.runelite.api.ChatLineBuffer; -import net.runelite.api.ChatMessageType; -import net.runelite.api.ClanMember; -import net.runelite.api.ClanMemberRank; -import net.runelite.api.Client; -import net.runelite.api.GameState; -import net.runelite.api.MessageNode; -import net.runelite.api.Player; -import net.runelite.api.ScriptID; -import net.runelite.api.SpriteID; -import net.runelite.api.VarClientStr; -import net.runelite.api.Varbits; -import net.runelite.api.events.ChatMessage; -import net.runelite.api.events.ClanChanged; -import net.runelite.api.events.ClanMemberJoined; -import net.runelite.api.events.ClanMemberLeft; -import net.runelite.api.events.ConfigChanged; -import net.runelite.api.events.GameStateChanged; -import net.runelite.api.events.GameTick; -import net.runelite.api.events.PlayerDespawned; -import net.runelite.api.events.PlayerSpawned; -import net.runelite.api.events.VarClientStrChanged; -import net.runelite.api.widgets.Widget; -import net.runelite.api.widgets.WidgetInfo; -import net.runelite.api.widgets.WidgetType; -import net.runelite.client.callback.ClientThread; -import net.runelite.client.chat.ChatMessageBuilder; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.game.ClanManager; -import net.runelite.client.game.SpriteManager; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import static net.runelite.client.ui.JagexColors.CHAT_CLAN_NAME_OPAQUE_BACKGROUND; -import static net.runelite.client.ui.JagexColors.CHAT_CLAN_NAME_TRANSPARENT_BACKGROUND; -import static net.runelite.client.ui.JagexColors.CHAT_CLAN_TEXT_OPAQUE_BACKGROUND; -import static net.runelite.client.ui.JagexColors.CHAT_CLAN_TEXT_TRANSPARENT_BACKGROUND; -import net.runelite.client.ui.overlay.infobox.InfoBoxManager; -import net.runelite.client.util.Text; +import net.runelite.client.plugins.*; +import net.runelite.client.game.*; +import net.runelite.client.callback.*; -@PluginDescriptor( - name = "Clan Chat", - description = "Add rank icons to users talking in clan chat", - tags = {"icons", "rank", "recent"} -) +import java.util.List; +import java.util.Objects; +import java.util.concurrent.*; +import net.runelite.client.config.*; +import com.google.inject.*; +import net.runelite.client.util.*; +import net.runelite.client.eventbus.*; +import com.google.common.base.*; +import net.runelite.api.widgets.*; +import net.runelite.client.ui.*; +import net.runelite.client.chat.*; +import java.awt.*; +import net.runelite.api.*; +import net.runelite.api.events.*; +import com.google.common.collect.*; +import java.util.*; +import java.util.function.*; +import net.runelite.client.ui.overlay.infobox.*; +import java.awt.image.*; + +@PluginDescriptor(name = "Clan Chat", description = "Add rank icons to users talking in clan chat", tags = { "icons", "rank", "recent" }) public class ClanChatPlugin extends Plugin { private static final int MAX_CHATS = 10; @@ -91,512 +32,376 @@ public class ClanChatPlugin extends Plugin private static final String RECENT_TITLE = "Recent Clan Chats"; private static final int JOIN_LEAVE_DURATION = 20; private static final int MESSAGE_DELAY = 10; - @Inject private Client client; - @Inject private ClanManager clanManager; - @Inject private ClanChatConfig config; - @Inject private InfoBoxManager infoBoxManager; - @Inject private SpriteManager spriteManager; - @Inject private ClientThread clientThread; - - private List chats = new ArrayList<>(); - private List clanMembers = new ArrayList<>(); + private List chats; + private static CopyOnWriteArrayList clanMembers; private ClanChatIndicator clanMemberCounter; - /** - * queue of temporary messages added to the client - */ - private final Deque clanJoinMessages = new ArrayDeque<>(); - private Map activityBuffer = new HashMap<>(); + private final Deque clanJoinMessages; + private Map activityBuffer; private int clanJoinedTick; + public ClanChatPlugin() { + this.chats = new ArrayList(); + this.clanJoinMessages = new ArrayDeque(); + this.activityBuffer = new HashMap(); + } + + public static CopyOnWriteArrayList getClanMembers() { + return (CopyOnWriteArrayList)ClanChatPlugin.clanMembers.clone(); + } + @Provides - ClanChatConfig getConfig(ConfigManager configManager) - { + ClanChatConfig getConfig(final ConfigManager configManager) { return configManager.getConfig(ClanChatConfig.class); } - @Override - public void startUp() - { - chats = new ArrayList<>(Text.fromCSV(config.chatsData())); + public void startUp() { + this.chats = new ArrayList(Text.fromCSV(this.config.chatsData())); } - @Override - public void shutDown() - { - clanMembers.clear(); - removeClanCounter(); - resetClanChats(); + public void shutDown() { + ClanChatPlugin.clanMembers.clear(); + this.removeClanCounter(); + this.resetClanChats(); } @Subscribe - public void onConfigChanged(ConfigChanged configChanged) - { - if (configChanged.getGroup().equals("clanchat")) - { - if (!config.recentChats()) - { - resetClanChats(); + public void onConfigChanged(final ConfigChanged configChanged) { + if (configChanged.getGroup().equals("clanchat")) { + if (!this.config.recentChats()) { + this.resetClanChats(); } - - if (config.showClanCounter()) - { - clientThread.invoke(this::addClanCounter); + if (this.config.showClanCounter()) { + this.clientThread.invoke(this::addClanCounter); } - else - { - removeClanCounter(); + else { + this.removeClanCounter(); } } } @Subscribe - public void onClanMemberJoined(ClanMemberJoined event) - { + public void onClanMemberJoined(final ClanMemberJoined event) { final ClanMember member = event.getMember(); - - if (member.getWorld() == client.getWorld()) - { - final Player local = client.getLocalPlayer(); + if (member.getWorld() == this.client.getWorld()) { final String memberName = Text.toJagexName(member.getUsername()); - - for (final Player player : client.getPlayers()) - { - if (player != null && player != local && memberName.equals(Text.toJagexName(player.getName()))) - { - clanMembers.add(player); - addClanCounter(); + for (final Player player : this.client.getPlayers()) { + if (player != null && memberName.equals(Text.toJagexName(player.getName()))) { + ClanChatPlugin.clanMembers.add(player); + this.addClanCounter(); break; } } } - - // clan members getting initialized isn't relevant - if (clanJoinedTick == client.getTickCount()) - { + if (this.clanJoinedTick == this.client.getTickCount()) { return; } - - if (!config.showJoinLeave() || - member.getRank().getValue() < config.joinLeaveRank().getValue()) - { + if (!this.config.showJoinLeave() || member.getRank().getValue() < this.config.joinLeaveRank().getValue()) { return; } - - // attempt to filter out world hopping joins - if (!activityBuffer.containsKey(member.getUsername())) - { - ClanMemberActivity joinActivity = new ClanMemberActivity(ClanActivityType.JOINED, - member, client.getTickCount()); - activityBuffer.put(member.getUsername(), joinActivity); + if (!this.activityBuffer.containsKey(member.getUsername())) { + final ClanMemberActivity joinActivity = new ClanMemberActivity(ClanActivityType.JOINED, member, this.client.getTickCount()); + this.activityBuffer.put(member.getUsername(), joinActivity); } - else - { - activityBuffer.remove(member.getUsername()); + else { + this.activityBuffer.remove(member.getUsername()); } } @Subscribe - public void onClanMemberLeft(ClanMemberLeft event) - { + public void onClanMemberLeft(final ClanMemberLeft event) { final ClanMember member = event.getMember(); - - if (member.getWorld() == client.getWorld()) - { + if (member.getWorld() == this.client.getWorld()) { final String memberName = Text.toJagexName(member.getUsername()); - final Iterator each = clanMembers.iterator(); - - while (each.hasNext()) - { - if (memberName.equals(Text.toJagexName(each.next().getName()))) - { + final Iterator each = ClanChatPlugin.clanMembers.iterator(); + while (each.hasNext()) { + if (memberName.equals(Text.toJagexName(each.next().getName()))) { each.remove(); - - if (clanMembers.isEmpty()) - { - removeClanCounter(); + if (ClanChatPlugin.clanMembers.isEmpty()) { + this.removeClanCounter(); + break; } - break; } } } - - if (!config.showJoinLeave() || - member.getRank().getValue() < config.joinLeaveRank().getValue()) - { + if (!this.config.showJoinLeave() || member.getRank().getValue() < this.config.joinLeaveRank().getValue()) { return; } - - if (!activityBuffer.containsKey(member.getUsername())) - { - ClanMemberActivity leaveActivity = new ClanMemberActivity(ClanActivityType.LEFT, - member, client.getTickCount()); - activityBuffer.put(member.getUsername(), leaveActivity); + if (!this.activityBuffer.containsKey(member.getUsername())) { + final ClanMemberActivity leaveActivity = new ClanMemberActivity(ClanActivityType.LEFT, member, this.client.getTickCount()); + this.activityBuffer.put(member.getUsername(), leaveActivity); } - else - { - activityBuffer.remove(member.getUsername()); + else { + this.activityBuffer.remove(member.getUsername()); } } @Subscribe - public void onGameTick(GameTick gameTick) - { - if (client.getGameState() != GameState.LOGGED_IN) - { + public void onGameTick(final GameTick gameTick) { + if (this.client.getGameState() != GameState.LOGGED_IN) { return; } - - Widget clanChatTitleWidget = client.getWidget(WidgetInfo.CLAN_CHAT_TITLE); - if (clanChatTitleWidget != null) - { - Widget clanChatList = client.getWidget(WidgetInfo.CLAN_CHAT_LIST); - Widget owner = client.getWidget(WidgetInfo.CLAN_CHAT_OWNER); - if (client.getClanChatCount() > 0) - { - clanChatTitleWidget.setText(CLAN_CHAT_TITLE + " (" + client.getClanChatCount() + "/100)"); + final Widget clanChatTitleWidget = this.client.getWidget(WidgetInfo.CLAN_CHAT_TITLE); + if (clanChatTitleWidget != null) { + final Widget clanChatList = this.client.getWidget(WidgetInfo.CLAN_CHAT_LIST); + final Widget owner = this.client.getWidget(WidgetInfo.CLAN_CHAT_OWNER); + if (this.client.getClanChatCount() > 0) { + clanChatTitleWidget.setText("Clan Chat (" + this.client.getClanChatCount() + "/100)"); } - else if (config.recentChats() && clanChatList.getChildren() == null && !Strings.isNullOrEmpty(owner.getText())) - { - clanChatTitleWidget.setText(RECENT_TITLE); - - loadClanChats(); + else if (this.config.recentChats() && clanChatList.getChildren() == null && !Strings.isNullOrEmpty(owner.getText())) { + clanChatTitleWidget.setText("Recent Clan Chats"); + this.loadClanChats(); } } - - if (!config.showJoinLeave()) - { + if (!this.config.showJoinLeave()) { return; } - - timeoutClanMessages(); - - addClanActivityMessages(); + this.timeoutClanMessages(); + this.addClanActivityMessages(); } - private void timeoutClanMessages() - { - if (clanJoinMessages.isEmpty()) - { + private void timeoutClanMessages() { + if (this.clanJoinMessages.isEmpty()) { return; } - boolean removed = false; - - for (Iterator it = clanJoinMessages.iterator(); it.hasNext(); ) - { - ClanJoinMessage clanJoinMessage = it.next(); - MessageNode messageNode = clanJoinMessage.getMessageNode(); + final Iterator it = this.clanJoinMessages.iterator(); + while (it.hasNext()) { + final ClanJoinMessage clanJoinMessage = it.next(); + final MessageNode messageNode = clanJoinMessage.getMessageNode(); final int createdTick = clanJoinMessage.getTick(); - - if (client.getTickCount() > createdTick + JOIN_LEAVE_DURATION) - { - it.remove(); - - // If this message has been reused since, it will get a different id - if (clanJoinMessage.getGetMessageId() == messageNode.getId()) - { - ChatLineBuffer ccInfoBuffer = client.getChatLineMap().get(ChatMessageType.FRIENDSCHATNOTIFICATION.getType()); - if (ccInfoBuffer != null) - { - ccInfoBuffer.removeMessageNode(messageNode); - removed = true; - } - } - } - else - { - // Everything else in the deque is newer + if (this.client.getTickCount() <= createdTick + 20) { break; } + it.remove(); + if (clanJoinMessage.getGetMessageId() != messageNode.getId()) { + continue; + } + final ChatLineBuffer ccInfoBuffer = this.client.getChatLineMap().get(ChatMessageType.FRIENDSCHATNOTIFICATION.getType()); + if (ccInfoBuffer == null) { + continue; + } + ccInfoBuffer.removeMessageNode(messageNode); + removed = true; } - - if (removed) - { - clientThread.invoke(() -> client.runScript(ScriptID.BUILD_CHATBOX)); + if (removed) { + this.clientThread.invoke(() -> this.client.runScript(216, new Object[0])); } } - private void addClanActivityMessages() - { - Iterator activityIt = activityBuffer.values().iterator(); - - while (activityIt.hasNext()) - { - ClanMemberActivity activity = activityIt.next(); - - if (activity.getTick() < client.getTickCount() - MESSAGE_DELAY) - { + private void addClanActivityMessages() { + final Iterator activityIt = this.activityBuffer.values().iterator(); + while (activityIt.hasNext()) { + final ClanMemberActivity activity = activityIt.next(); + if (activity.getTick() < this.client.getTickCount() - 10) { activityIt.remove(); - addActivityMessage(activity.getMember(), activity.getActivityType()); + this.addActivityMessage(activity.getMember(), activity.getActivityType()); } } } - private void addActivityMessage(ClanMember member, ClanActivityType activityType) - { - final String activityMessage = activityType == ClanActivityType.JOINED ? " has joined." : " has left."; + private void addActivityMessage(final ClanMember member, final ClanActivityType activityType) { + final String activityMessage = (activityType == ClanActivityType.JOINED) ? " has joined." : " has left."; final ClanMemberRank rank = member.getRank(); - Color textColor = CHAT_CLAN_TEXT_OPAQUE_BACKGROUND; - Color channelColor = CHAT_CLAN_NAME_OPAQUE_BACKGROUND; + Color textColor = JagexColors.CHAT_CLAN_TEXT_OPAQUE_BACKGROUND; + Color channelColor = JagexColors.CHAT_CLAN_NAME_OPAQUE_BACKGROUND; int rankIcon = -1; - - if (client.isResized() && client.getVar(Varbits.TRANSPARENT_CHATBOX) == 1) - { - textColor = CHAT_CLAN_TEXT_TRANSPARENT_BACKGROUND; - channelColor = CHAT_CLAN_NAME_TRANSPARENT_BACKGROUND; + if (this.client.isResized() && this.client.getVar(Varbits.TRANSPARENT_CHATBOX) == 1) { + textColor = JagexColors.CHAT_CLAN_TEXT_TRANSPARENT_BACKGROUND; + channelColor = JagexColors.CHAT_CLAN_NAME_TRANSPARENT_BACKGROUND; } - - if (config.clanChatIcons() && rank != null && rank != ClanMemberRank.UNRANKED) - { - rankIcon = clanManager.getIconNumber(rank); + if (this.config.clanChatIcons() && rank != null && rank != ClanMemberRank.UNRANKED) { + rankIcon = this.clanManager.getIconNumber(rank); } - - ChatMessageBuilder message = new ChatMessageBuilder() - .append("[") - .append(channelColor, client.getClanChatName()); - if (rankIcon > -1) - { - message - .append(" ") - .img(rankIcon); + final ChatMessageBuilder message = new ChatMessageBuilder().append("[").append(channelColor, this.client.getClanChatName()); + if (rankIcon > -1) { + message.append(" ").img(rankIcon); } - message - .append("] ") - .append(textColor, member.getUsername() + activityMessage); - + message.append("] ").append(textColor, member.getUsername() + activityMessage); final String messageString = message.build(); - client.addChatMessage(ChatMessageType.FRIENDSCHATNOTIFICATION, "", messageString, ""); - - final ChatLineBuffer chatLineBuffer = client.getChatLineMap().get(ChatMessageType.FRIENDSCHATNOTIFICATION.getType()); + this.client.addChatMessage(ChatMessageType.FRIENDSCHATNOTIFICATION, "", messageString, ""); + final ChatLineBuffer chatLineBuffer = this.client.getChatLineMap().get(ChatMessageType.FRIENDSCHATNOTIFICATION.getType()); final MessageNode[] lines = chatLineBuffer.getLines(); final MessageNode line = lines[0]; - - ClanJoinMessage clanJoinMessage = new ClanJoinMessage(line, line.getId(), client.getTickCount()); - clanJoinMessages.addLast(clanJoinMessage); + final ClanJoinMessage clanJoinMessage = new ClanJoinMessage(line, line.getId(), this.client.getTickCount()); + this.clanJoinMessages.addLast(clanJoinMessage); } @Subscribe - public void onVarClientStrChanged(VarClientStrChanged strChanged) - { - if (strChanged.getIndex() == VarClientStr.RECENT_CLAN_CHAT.getIndex() && config.recentChats()) - { - updateRecentChat(client.getVar(VarClientStr.RECENT_CLAN_CHAT)); + public void onVarClientStrChanged(final VarClientStrChanged strChanged) { + if (strChanged.getIndex() == VarClientStr.RECENT_CLAN_CHAT.getIndex() && this.config.recentChats()) { + this.updateRecentChat(this.client.getVar(VarClientStr.RECENT_CLAN_CHAT)); } } @Subscribe - public void onChatMessage(ChatMessage chatMessage) - { - if (client.getGameState() != GameState.LOADING && client.getGameState() != GameState.LOGGED_IN) - { + public void onChatMessage(final ChatMessage chatMessage) { + if (this.client.getGameState() != GameState.LOADING && this.client.getGameState() != GameState.LOGGED_IN) { return; } - - if (client.getClanChatCount() <= 0) - { + if (this.client.getClanChatCount() <= 0) { return; } - - switch (chatMessage.getType()) - { + switch (chatMessage.getType()) { case PRIVATECHAT: - case MODPRIVATECHAT: - if (!config.privateMessageIcons()) - { + case MODPRIVATECHAT: { + if (!this.config.privateMessageIcons()) { return; } break; + } case PUBLICCHAT: - case MODCHAT: - if (!config.publicChatIcons()) - { + case MODCHAT: { + if (!this.config.publicChatIcons()) { return; } break; - case FRIENDSCHAT: - if (!config.clanChatIcons()) - { + } + case FRIENDSCHAT: { + if (!this.config.clanChatIcons()) { return; } break; - default: + } + default: { return; + } } - - insertClanRankIcon(chatMessage); + this.insertClanRankIcon(chatMessage); } @Subscribe - public void onGameStateChanged(GameStateChanged state) - { - GameState gameState = state.getGameState(); - - if (gameState == GameState.LOGIN_SCREEN || gameState == GameState.CONNECTION_LOST || gameState == GameState.HOPPING) - { - clanMembers.clear(); - removeClanCounter(); - - clanJoinMessages.clear(); + public void onGameStateChanged(final GameStateChanged state) { + final GameState gameState = state.getGameState(); + if (gameState == GameState.LOGIN_SCREEN || gameState == GameState.CONNECTION_LOST || gameState == GameState.HOPPING) { + ClanChatPlugin.clanMembers.clear(); + this.removeClanCounter(); + this.clanJoinMessages.clear(); } } @Subscribe - public void onPlayerSpawned(PlayerSpawned event) - { - final Player local = client.getLocalPlayer(); - final Player player = event.getPlayer(); - - if (player != local && player.isClanMember()) - { - clanMembers.add(player); - addClanCounter(); + public void onPlayerSpawned(final PlayerSpawned event) { + if (event.getPlayer().isClanMember()) { + ClanChatPlugin.clanMembers.add(event.getPlayer()); + this.addClanCounter(); } } @Subscribe - public void onPlayerDespawned(PlayerDespawned event) - { - if (clanMembers.remove(event.getPlayer()) && clanMembers.isEmpty()) - { - removeClanCounter(); + public void onPlayerDespawned(final PlayerDespawned event) { + if (ClanChatPlugin.clanMembers.remove(event.getPlayer()) && ClanChatPlugin.clanMembers.isEmpty()) { + this.removeClanCounter(); } } @Subscribe - public void onClanChanged(ClanChanged event) - { - if (event.isJoined()) - { - clanJoinedTick = client.getTickCount(); + public void onClanChanged(final ClanChanged event) { + if (event.isJoined()) { + this.clanJoinedTick = this.client.getTickCount(); } - else - { - clanMembers.clear(); - removeClanCounter(); + else { + ClanChatPlugin.clanMembers.clear(); + this.removeClanCounter(); } - - activityBuffer.clear(); + this.activityBuffer.clear(); } - int getClanAmount() - { - return clanMembers.size(); + int getClanAmount() { + return ClanChatPlugin.clanMembers.size(); } - private void insertClanRankIcon(final ChatMessage message) - { - final ClanMemberRank rank = clanManager.getRank(message.getName()); - - if (rank != null && rank != ClanMemberRank.UNRANKED) - { - int iconNumber = clanManager.getIconNumber(rank); + private void insertClanRankIcon(final ChatMessage message) { + final ClanMemberRank rank = this.clanManager.getRank(message.getName()); + if (rank != null && rank != ClanMemberRank.UNRANKED) { + final int iconNumber = this.clanManager.getIconNumber(rank); final String img = ""; - if (message.getType() == ChatMessageType.FRIENDSCHAT) - { - message.getMessageNode() - .setSender(message.getMessageNode().getSender() + " " + img); + if (message.getType() == ChatMessageType.FRIENDSCHAT) { + message.getMessageNode().setSender(message.getMessageNode().getSender() + " " + img); } - else - { - message.getMessageNode() - .setName(img + message.getMessageNode().getName()); + else { + message.getMessageNode().setName(img + message.getMessageNode().getName()); } - client.refreshChat(); + this.client.refreshChat(); } } - private void resetClanChats() - { - Widget clanChatList = client.getWidget(WidgetInfo.CLAN_CHAT_LIST); - Widget clanChatTitleWidget = client.getWidget(WidgetInfo.CLAN_CHAT_TITLE); - - if (clanChatList == null) - { + private void resetClanChats() { + final Widget clanChatList = this.client.getWidget(WidgetInfo.CLAN_CHAT_LIST); + final Widget clanChatTitleWidget = this.client.getWidget(WidgetInfo.CLAN_CHAT_TITLE); + if (clanChatList == null) { return; } - - if (client.getClanChatCount() == 0) - { + if (this.client.getClanChatCount() == 0) { clanChatList.setChildren(null); } - - clanChatTitleWidget.setText(CLAN_CHAT_TITLE); + clanChatTitleWidget.setText("Clan Chat"); } - private void loadClanChats() - { - Widget clanChatList = client.getWidget(WidgetInfo.CLAN_CHAT_LIST); - if (clanChatList == null) - { + private void loadClanChats() { + final Widget clanChatList = this.client.getWidget(WidgetInfo.CLAN_CHAT_LIST); + if (clanChatList == null) { return; } - int y = 2; clanChatList.setChildren(null); - for (String chat : Lists.reverse(chats)) - { - Widget widget = clanChatList.createChild(-1, WidgetType.TEXT); + for (final String chat : Lists.reverse(this.chats)) { + final Widget widget = clanChatList.createChild(-1, 4); widget.setFontId(494); - widget.setTextColor(0xffffff); + widget.setTextColor(16777215); widget.setText(chat); widget.setOriginalHeight(14); widget.setOriginalWidth(142); widget.setOriginalY(y); widget.setOriginalX(20); widget.revalidate(); - y += 14; } } - private void updateRecentChat(String s) - { - if (Strings.isNullOrEmpty(s)) - { + private void updateRecentChat(String s) { + if (Strings.isNullOrEmpty(s)) { return; } - s = Text.toJagexName(s); - - chats.removeIf(s::equalsIgnoreCase); - chats.add(s); - - while (chats.size() > MAX_CHATS) - { - chats.remove(0); + final List chats = this.chats; + final String s2 = s; + Objects.requireNonNull(s2); + chats.removeIf(s2::equalsIgnoreCase); + this.chats.add(s); + while (this.chats.size() > 10) { + this.chats.remove(0); } - - config.chatsData(Text.toCSV(chats)); + this.config.chatsData(Text.toCSV(this.chats)); } - private void removeClanCounter() - { - infoBoxManager.removeInfoBox(clanMemberCounter); - clanMemberCounter = null; + private void removeClanCounter() { + this.infoBoxManager.removeInfoBox(this.clanMemberCounter); + this.clanMemberCounter = null; } - private void addClanCounter() - { - if (!config.showClanCounter() || clanMemberCounter != null || clanMembers.isEmpty()) - { + private void addClanCounter() { + if (!this.config.showClanCounter() || this.clanMemberCounter != null || ClanChatPlugin.clanMembers.isEmpty()) { return; } + final BufferedImage image = this.spriteManager.getSprite(904, 0); + this.clanMemberCounter = new ClanChatIndicator(image, this); + this.infoBoxManager.addInfoBox(this.clanMemberCounter); + } - final BufferedImage image = spriteManager.getSprite(SpriteID.TAB_CLAN_CHAT, 0); - clanMemberCounter = new ClanChatIndicator(image, this); - infoBoxManager.addInfoBox(clanMemberCounter); + static { + ClanChatPlugin.clanMembers = new CopyOnWriteArrayList(); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java index 9180d6f007..4fdc6efa09 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java @@ -303,7 +303,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc new CrypticClue("Search the drawers, upstairs in the bank to the East of Varrock.", DRAWERS_7194, new WorldPoint(3250, 3420, 1), "Search the drawers upstairs in Varrock east bank."), new CrypticClue("Speak to Hazelmere.", "Hazelmere", new WorldPoint(2677, 3088, 1), "Located upstairs in the house to the north of fairy ring CLS. Answer: 6859"), new CrypticClue("The effects of this fire are magnified.", new WorldPoint(1179, 3626, 0), "Dig by the fire beside Ket'sal K'uk in the westernmost part of the Kebos Swamp. "), - new CrypticClue("Always walking around the castle grounds and somehow knows everyone's age.", "Hans", new WorldPoint(3221, 3218, 0), "Talk to Hans walking around Lumbridge Castle."), + new CrypticClue("Always walking around the castle grounds and somehow everyone's age.", "Hans", new WorldPoint(3221, 3218, 0), "Talk to Hans walking around Lumbridge Castle."), new CrypticClue("In the place Duke Horacio calls home, talk to a man with a hat dropped by goblins.", "Cook", new WorldPoint(3208, 3213, 0), "Talk to the Cook in Lumbridge Castle."), new CrypticClue("In a village of barbarians, I am the one who guards the village from up high.", "Hunding", new WorldPoint(3097, 3432, 2), "Talk to Hunding atop the tower on the east side of Barbarian Village."), new CrypticClue("Talk to Charlie the Tramp in Varrock.", "Charlie the Tramp", new WorldPoint(3209, 3390, 0), "Talk to Charlie the Tramp by the southern entrance to Varrock. He will give you a task."), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java index b6c6fa2a43..bf9d40bac9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java @@ -143,9 +143,8 @@ public enum HotColdLocation WILDERNESS_5(new WorldPoint(3169, 3558, 0), WILDERNESS, "North of the Grand Exchange, level 5 Wilderness."), WILDERNESS_12(new WorldPoint(3038, 3612, 0), WILDERNESS, "South-east of the Dark Warriors' Fortress, level 12 Wilderness."), WILDERNESS_20(new WorldPoint(3225, 3676, 0), WILDERNESS, "East of the Corporeal Beast's lair, level 20 Wilderness."), - WILDERNESS_27(new WorldPoint(3174, 3735, 0), WILDERNESS, "Inside the Ruins north of the Graveyard of Shadows, level 27 Wilderness."), + WILDERNESS_27(new WorldPoint(3174, 3735, 0), WILDERNESS, "North-west of the Corporeal Beast cave, in the ruins at level 27 Wilderness."), WILDERNESS_28(new WorldPoint(3374, 3734, 0), WILDERNESS, "East of Venenatis' nest, level 28 Wilderness."), - WILDERNESS_32(new WorldPoint(3311, 3773, 0), WILDERNESS, "North of Venenatis' nest, level 32 Wilderness."), WILDERNESS_35(new WorldPoint(3153, 3795, 0), WILDERNESS, "East of the Wilderness canoe exit, level 35 Wilderness."), WILDERNESS_37(new WorldPoint(2975, 3811, 0), WILDERNESS, "South-east of the Chaos Temple, level 37 Wilderness."), WILDERNESS_38(new WorldPoint(3294, 3817, 0), WILDERNESS, "South of Callisto, level 38 Wilderness."), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java index 443dd8ac12..9598b7eff5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java @@ -406,7 +406,10 @@ public class DiscordPlugin extends Plugin final EnumSet worldType = client.getWorldType(); // Do not show location in PVP activities - if (WorldType.isPvpWorld(worldType)) + if (worldType.contains(WorldType.SEASONAL_DEADMAN) || + worldType.contains(WorldType.DEADMAN) || + worldType.contains(WorldType.PVP) || + worldType.contains(WorldType.PVP_HIGH_RISK)) { return false; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java index 01d7454e4a..17cb508a12 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingConfig.java @@ -118,15 +118,4 @@ public interface FishingConfig extends Config { return true; } - - @ConfigItem( - position = 8, - keyName = "trawlerTimer", - name = "Trawler timer in MM:SS", - description = "Trawler Timer will display a more accurate timer in MM:SS format." - ) - default boolean trawlerTimer() - { - return true; - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java index d27886c1aa..b9144a300f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java @@ -57,10 +57,6 @@ import net.runelite.api.events.ItemContainerChanged; import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.NpcSpawned; import net.runelite.api.events.VarbitChanged; -import net.runelite.api.events.WidgetLoaded; -import net.runelite.api.widgets.Widget; -import net.runelite.api.widgets.WidgetID; -import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -82,10 +78,8 @@ public class FishingPlugin extends Plugin { private static final int TRAWLER_SHIP_REGION_NORMAL = 7499; private static final int TRAWLER_SHIP_REGION_SINKING = 8011; - private static final int TRAWLER_TIME_LIMIT_IN_SECONDS = 614; - private static final int TRAWLER_ACTIVITY_THRESHOLD = Math.round(0.15f * 255); - private Instant trawlerStartTime; + private static final int TRAWLER_ACTIVITY_THRESHOLD = Math.round(0.15f * 255); @Getter(AccessLevel.PACKAGE) private final FishingSession session = new FishingSession(); @@ -148,7 +142,6 @@ public class FishingPlugin extends Plugin minnowSpots.clear(); trawlerNotificationSent = false; currentSpot = null; - trawlerStartTime = null; } @Subscribe @@ -303,11 +296,6 @@ public class FishingPlugin extends Plugin } } } - - if (config.trawlerTimer()) - { - updateTrawlerTimer(); - } } @Subscribe @@ -363,66 +351,6 @@ public class FishingPlugin extends Plugin } } - @Subscribe - public void onWidgetLoaded(WidgetLoaded event) - { - if (event.getGroupId() == WidgetID.FISHING_TRAWLER_GROUP_ID) - { - trawlerStartTime = Instant.now(); - } - } - - /** - * Changes the Fishing Trawler timer widget from minutes to minutes and seconds - */ - private void updateTrawlerTimer() - { - if (trawlerStartTime == null) - { - return; - } - - int regionID = client.getLocalPlayer().getWorldLocation().getRegionID(); - if (regionID != TRAWLER_SHIP_REGION_NORMAL && regionID != TRAWLER_SHIP_REGION_SINKING) - { - log.debug("Trawler session ended"); - return; - } - - Widget trawlerTimerWidget = client.getWidget(WidgetInfo.FISHING_TRAWLER_TIMER); - if (trawlerTimerWidget == null) - { - return; - } - - long timeLeft = TRAWLER_TIME_LIMIT_IN_SECONDS - Duration.between(trawlerStartTime, Instant.now()).getSeconds(); - int minutes = (int) timeLeft / 60; - int seconds = (int) timeLeft % 60; - - final StringBuilder trawlerText = new StringBuilder(); - trawlerText.append("Time Left: "); - - if (minutes > 0) - { - trawlerText.append(minutes); - } - else - { - trawlerText.append("00"); - } - - trawlerText.append(':'); - - if (seconds < 10) - { - trawlerText.append("0"); - } - - trawlerText.append(seconds); - - trawlerTimerWidget.setText(trawlerText.toString()); - } - private void inverseSortSpotDistanceFromPlayer() { final LocalPoint cameraPoint = new LocalPoint(client.getCameraX(), client.getCameraY()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaConfig.java index 99084a9172..311e286b0b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaConfig.java @@ -37,6 +37,7 @@ public interface NpcAggroAreaConfig extends Config String CONFIG_CENTER2 = "center2"; String CONFIG_LOCATION = "location"; String CONFIG_DURATION = "duration"; + String CONFIG_NOT_WORKING_OVERLAY = "overlay"; @ConfigItem( keyName = "npcUnaggroAlwaysActive", @@ -95,12 +96,12 @@ public interface NpcAggroAreaConfig extends Config @ConfigItem( keyName = "npcUnaggroShowNotWorkingOverlay", - name = "Hide overlay hint", - description = "Hide overlay hint if plugin is enabled in unsupported area", + name = "Show not working hint", + description = "Show hint if plugin is enabled in unsupported area", position = 6 ) - default boolean hideOverlayHint() + default boolean showNotWorkingOverlay() { - return false; + return true; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java index 3d238cce85..0a9dedb357 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java @@ -36,14 +36,12 @@ import net.runelite.client.ui.overlay.components.PanelComponent; class NpcAggroAreaNotWorkingOverlay extends Overlay { private final NpcAggroAreaPlugin plugin; - private final NpcAggroAreaConfig config; private final PanelComponent panelComponent; @Inject - private NpcAggroAreaNotWorkingOverlay(NpcAggroAreaPlugin plugin, NpcAggroAreaConfig config) + private NpcAggroAreaNotWorkingOverlay(NpcAggroAreaPlugin plugin) { this.plugin = plugin; - this.config = config; panelComponent = new PanelComponent(); panelComponent.setPreferredSize(new Dimension(150, 0)); @@ -58,7 +56,7 @@ class NpcAggroAreaNotWorkingOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (!plugin.isActive() || plugin.getSafeCenters()[1] != null || config.hideOverlayHint()) + if (!plugin.isActive() || plugin.getSafeCenters()[1] != null) { return null; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java index 75ebd40228..10dd5752f9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaPlugin.java @@ -128,6 +128,7 @@ public class NpcAggroAreaPlugin extends Plugin private WorldPoint previousUnknownCenter; private boolean loggingIn; private List npcNamePatterns; + private boolean notWorkingOverlayShown = false; @Provides NpcAggroAreaConfig provideConfig(ConfigManager configManager) @@ -139,7 +140,12 @@ public class NpcAggroAreaPlugin extends Plugin protected void startUp() throws Exception { overlayManager.add(overlay); + if (config.showNotWorkingOverlay()) + { overlayManager.add(notWorkingOverlay); + notWorkingOverlayShown = true; + } + npcNamePatterns = NAME_SPLITTER.splitToList(config.npcNamePatterns()); recheckActive(); } @@ -149,7 +155,11 @@ public class NpcAggroAreaPlugin extends Plugin { removeTimer(); overlayManager.remove(overlay); + if (notWorkingOverlayShown) + { overlayManager.remove(notWorkingOverlay); + } + Arrays.fill(safeCenters, null); lastPlayerLocation = null; currentTimer = null; @@ -406,6 +416,7 @@ public class NpcAggroAreaPlugin extends Plugin configManager.unsetConfiguration(NpcAggroAreaConfig.CONFIG_GROUP, NpcAggroAreaConfig.CONFIG_CENTER2); configManager.unsetConfiguration(NpcAggroAreaConfig.CONFIG_GROUP, NpcAggroAreaConfig.CONFIG_LOCATION); configManager.unsetConfiguration(NpcAggroAreaConfig.CONFIG_GROUP, NpcAggroAreaConfig.CONFIG_DURATION); + configManager.unsetConfiguration(NpcAggroAreaConfig.CONFIG_GROUP, NpcAggroAreaConfig.CONFIG_NOT_WORKING_OVERLAY); } private void saveConfig() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java index 2ebf2a4318..fdc05403df 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/questlist/QuestListPlugin.java @@ -36,11 +36,12 @@ import net.runelite.api.SpriteID; import net.runelite.api.VarClientInt; import net.runelite.api.Varbits; import net.runelite.api.events.GameStateChanged; -import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.VarClientIntChanged; import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.JavaScriptCallback; import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetPositionMode; import net.runelite.api.widgets.WidgetType; @@ -103,45 +104,46 @@ public class QuestListPlugin extends Plugin } @Subscribe - public void onScriptCallbackEvent(ScriptCallbackEvent event) + public void onWidgetLoaded(WidgetLoaded widgetLoaded) { - if (!event.getEventName().equals("questProgressUpdated")) + if (widgetLoaded.getGroupId() == WidgetID.QUESTLIST_GROUP_ID) { - return; - } + Widget header = client.getWidget(WidgetInfo.QUESTLIST_BOX); + if (header != null) + { + questSearchButton = header.createChild(-1, WidgetType.GRAPHIC); + questSearchButton.setSpriteId(SpriteID.GE_SEARCH); + questSearchButton.setOriginalWidth(18); + questSearchButton.setOriginalHeight(17); + questSearchButton.setXPositionMode(WidgetPositionMode.ABSOLUTE_RIGHT); + questSearchButton.setOriginalX(5); + questSearchButton.setOriginalY(0); + questSearchButton.setHasListener(true); + questSearchButton.setAction(1, MENU_OPEN); + questSearchButton.setOnOpListener((JavaScriptCallback) e -> openSearch()); + questSearchButton.setName(MENU_SEARCH); + questSearchButton.revalidate(); - Widget header = client.getWidget(WidgetInfo.QUESTLIST_BOX); - if (header != null) - { - questSearchButton = header.createChild(-1, WidgetType.GRAPHIC); - questSearchButton.setSpriteId(SpriteID.GE_SEARCH); - questSearchButton.setOriginalWidth(18); - questSearchButton.setOriginalHeight(17); - questSearchButton.setXPositionMode(WidgetPositionMode.ABSOLUTE_RIGHT); - questSearchButton.setOriginalX(5); - questSearchButton.setOriginalY(0); - questSearchButton.setHasListener(true); - questSearchButton.setAction(1, MENU_OPEN); - questSearchButton.setOnOpListener((JavaScriptCallback) e -> openSearch()); - questSearchButton.setName(MENU_SEARCH); - questSearchButton.revalidate(); + questHideButton = header.createChild(-1, WidgetType.GRAPHIC); + redrawHideButton(); - questHideButton = header.createChild(-1, WidgetType.GRAPHIC); - redrawHideButton(); + questHideButton.setOriginalWidth(13); + questHideButton.setOriginalHeight(13); + questHideButton.setXPositionMode(WidgetPositionMode.ABSOLUTE_RIGHT); + questHideButton.setOriginalX(24); + questHideButton.setOriginalY(2); + questHideButton.setHasListener(true); + questHideButton.setOnOpListener((JavaScriptCallback) e -> toggleHidden()); + questHideButton.setAction(1, MENU_TOGGLE); + questHideButton.revalidate(); - questHideButton.setOriginalWidth(13); - questHideButton.setOriginalHeight(13); - questHideButton.setXPositionMode(WidgetPositionMode.ABSOLUTE_RIGHT); - questHideButton.setOriginalX(24); - questHideButton.setOriginalY(2); - questHideButton.setHasListener(true); - questHideButton.setOnOpListener((JavaScriptCallback) e -> toggleHidden()); - questHideButton.setAction(1, MENU_TOGGLE); - questHideButton.revalidate(); + questSet = new EnumMap<>(QuestContainer.class); - questSet = new EnumMap<>(QuestContainer.class); - - updateFilter(); + if (!header.isHidden()) + { + updateFilter(); + } + } } } @@ -257,26 +259,21 @@ public class QuestListPlugin extends Plugin int y = miniList.getRelativeY() + miniList.getHeight() + 10; - int newHeight; + int newHeight = 0; if (container.getScrollHeight() > 0) { newHeight = (container.getScrollY() * y) / container.getScrollHeight(); } - else - { - newHeight = 0; - } container.setScrollHeight(y); container.revalidateScroll(); - clientThread.invokeLater(() -> - client.runScript( - ScriptID.UPDATE_SCROLLBAR, - WidgetInfo.QUESTLIST_SCROLLBAR.getId(), - WidgetInfo.QUESTLIST_CONTAINER.getId(), - newHeight - )); + client.runScript( + ScriptID.UPDATE_SCROLLBAR, + WidgetInfo.QUESTLIST_SCROLLBAR.getId(), + WidgetInfo.QUESTLIST_CONTAINER.getId(), + newHeight + ); } private void updateList(QuestContainer questContainer, String filter) @@ -312,7 +309,7 @@ public class QuestListPlugin extends Plugin // Find all of the widgets that we care about, sorting by their Y value quests = Arrays.stream(list.getDynamicChildren()) .sorted(Comparator.comparing(Widget::getRelativeY)) - .filter(w -> !QUEST_HEADERS.contains(w.getText())) + .filter(w -> !w.isSelfHidden() && !QUEST_HEADERS.contains(w.getText())) .map(w -> new QuestWidget(w, Text.removeTags(w.getText()).toLowerCase())) .collect(Collectors.toList()); questSet.put(questContainer, quests); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java index 9a56f6eeab..f541ab2152 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java @@ -554,7 +554,7 @@ public class WorldHopperPlugin extends Plugin if (config.quickhopOutOfDanger()) { currentWorldTypes.remove(WorldType.PVP); - currentWorldTypes.remove(WorldType.HIGH_RISK); + currentWorldTypes.remove(WorldType.PVP_HIGH_RISK); } // Don't regard these worlds as a type that must be hopped between currentWorldTypes.remove(WorldType.BOUNTY); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java index a450c36b89..a497da60e7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java @@ -245,7 +245,7 @@ class WorldTableRow extends JPanel return; } else if (world.getTypes().contains(WorldType.PVP) - || world.getTypes().contains(WorldType.HIGH_RISK) + || world.getTypes().contains(WorldType.PVP_HIGH_RISK) || world.getTypes().contains(WorldType.DEADMAN) || world.getTypes().contains(WorldType.SEASONAL_DEADMAN)) { diff --git a/runelite-client/src/main/scripts/QuestListShowProgress.hash b/runelite-client/src/main/scripts/QuestListShowProgress.hash deleted file mode 100644 index d3899f1431..0000000000 --- a/runelite-client/src/main/scripts/QuestListShowProgress.hash +++ /dev/null @@ -1 +0,0 @@ -A6B3A7BFE7B688A08F69B91A7FD5C7184D71147D3DAF74B1262369D85DBB3A03 \ No newline at end of file diff --git a/runelite-client/src/main/scripts/QuestListShowProgress.rs2asm b/runelite-client/src/main/scripts/QuestListShowProgress.rs2asm deleted file mode 100644 index f7f91cd83e..0000000000 --- a/runelite-client/src/main/scripts/QuestListShowProgress.rs2asm +++ /dev/null @@ -1,198 +0,0 @@ -.id 1354 -.int_stack_count 3 -.string_stack_count 0 -.int_var_count 7 -.string_var_count 0 - iconst 0 - istore 3 - iconst 0 - istore 4 - iconst 0 - istore 5 - invoke 1340 - istore 6 -LABEL8: - iload 5 - iload 6 - if_icmplt LABEL12 - jump LABEL56 -LABEL12: - iload 0 - iload 5 - cc_find - iconst 1 - if_icmpeq LABEL18 - jump LABEL51 -LABEL18: - iload 5 - invoke 1357 - istore 3 - iload 3 - iconst 2 - if_icmpeq LABEL25 - jump LABEL28 -LABEL25: - iconst 901389 - istore 4 - jump LABEL37 -LABEL28: - iload 3 - iconst 0 - if_icmpeq LABEL32 - jump LABEL35 -LABEL32: - iconst 16776960 - istore 4 - jump LABEL37 -LABEL35: - iconst 16711680 - istore 4 -LABEL37: - iload 4 - cc_setcolour - iconst 85 - iconst -2147483645 - iconst -2147483643 - iconst 16777215 - sconst "Iii" - cc_setonmouseover - iconst 85 - iconst -2147483645 - iconst -2147483643 - iload 4 - sconst "Iii" - cc_setonmouseleave -LABEL51: - iload 5 - iconst 1 - add - istore 5 - jump LABEL8 -LABEL56: - iconst 0 - invoke 2245 - istore 6 - istore 5 -LABEL60: - iload 5 - iload 6 - if_icmplt LABEL64 - jump LABEL108 -LABEL64: - iload 1 - iload 5 - cc_find - iconst 1 - if_icmpeq LABEL70 - jump LABEL103 -LABEL70: - iload 5 - invoke 1358 - istore 3 - iload 3 - iconst 2 - if_icmpeq LABEL77 - jump LABEL80 -LABEL77: - iconst 901389 - istore 4 - jump LABEL89 -LABEL80: - iload 3 - iconst 0 - if_icmpeq LABEL84 - jump LABEL87 -LABEL84: - iconst 16776960 - istore 4 - jump LABEL89 -LABEL87: - iconst 16711680 - istore 4 -LABEL89: - iload 4 - cc_setcolour - iconst 85 - iconst -2147483645 - iconst -2147483643 - iconst 16777215 - sconst "Iii" - cc_setonmouseover - iconst 85 - iconst -2147483645 - iconst -2147483643 - iload 4 - sconst "Iii" - cc_setonmouseleave -LABEL103: - iload 5 - iconst 1 - add - istore 5 - jump LABEL60 -LABEL108: - iconst 0 - invoke 2265 - istore 6 - istore 5 -LABEL112: - iload 5 - iload 6 - if_icmplt LABEL116 - jump LABEL160 -LABEL116: - iload 2 - iload 5 - cc_find - iconst 1 - if_icmpeq LABEL122 - jump LABEL155 -LABEL122: - iload 5 - invoke 1359 - istore 3 - iload 3 - iconst 2 - if_icmpeq LABEL129 - jump LABEL132 -LABEL129: - iconst 901389 - istore 4 - jump LABEL141 -LABEL132: - iload 3 - iconst 0 - if_icmpeq LABEL136 - jump LABEL139 -LABEL136: - iconst 16776960 - istore 4 - jump LABEL141 -LABEL139: - iconst 16711680 - istore 4 -LABEL141: - iload 4 - cc_setcolour - iconst 85 - iconst -2147483645 - iconst -2147483643 - iconst 16777215 - sconst "Iii" - cc_setonmouseover - iconst 85 - iconst -2147483645 - iconst -2147483643 - iload 4 - sconst "Iii" - cc_setonmouseleave -LABEL155: - iload 5 - iconst 1 - add - istore 5 - jump LABEL112 -LABEL160: - sconst "questProgressUpdated" - runelite_callback - return