From 7051bedc61c1be0ac98cec8f6960e5e443b860a0 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Fri, 18 Mar 2022 00:53:56 +0000 Subject: [PATCH] cannon: add support for shattered relics league ornamental cannon Annoyingly, the cannonball projectiles are not fired out of the centre of the cannon object like the original cannon does, so how the cannon's position is stored had to be changed to a WorldArea --- .../main/java/net/runelite/api/GraphicID.java | 2 ++ .../client/plugins/cannon/CannonOverlay.java | 5 ++- .../client/plugins/cannon/CannonPlugin.java | 35 +++++++++++++------ 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/GraphicID.java b/runelite-api/src/main/java/net/runelite/api/GraphicID.java index d172a7af77..5d12d655e6 100644 --- a/runelite-api/src/main/java/net/runelite/api/GraphicID.java +++ b/runelite-api/src/main/java/net/runelite/api/GraphicID.java @@ -53,4 +53,6 @@ public final class GraphicID public static final int GRANITE_CANNONBALL = 1443; public static final int GRAPHICS_OBJECT_ROCKFALL = 1727; public static final int ZALCANO_PROJECTILE_FIREBALL = 1728; + public static final int CANNONBALL_OR = 2018; + public static final int GRANITE_CANNONBALL_OR = 2019; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java index b2a4c7df36..51e3165dd9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java @@ -34,6 +34,7 @@ import net.runelite.api.Perspective; import static net.runelite.api.Perspective.LOCAL_TILE_SIZE; import net.runelite.api.Point; import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; @@ -66,7 +67,9 @@ class CannonOverlay extends Overlay return null; } - LocalPoint cannonPoint = LocalPoint.fromWorld(client, plugin.getCannonPosition()); + // WorldAreas return the SW point, whereas we want the centre point + WorldPoint cannonLocation = plugin.getCannonPosition().toWorldPoint().dx(1).dy(1); + LocalPoint cannonPoint = LocalPoint.fromWorld(client, cannonLocation); if (cannonPoint == null) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java index cc5d47324d..1e9282211e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java @@ -24,10 +24,12 @@ */ package net.runelite.client.plugins.cannon; +import com.google.common.collect.ImmutableSet; import com.google.inject.Provides; import java.awt.Color; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.inject.Inject; @@ -37,18 +39,17 @@ import net.runelite.api.ChatMessageType; import net.runelite.api.Client; import net.runelite.api.GameObject; import net.runelite.api.GameState; -import static net.runelite.api.GraphicID.CANNONBALL; -import static net.runelite.api.GraphicID.GRANITE_CANNONBALL; +import net.runelite.api.GraphicID; import net.runelite.api.InventoryID; import net.runelite.api.Item; import net.runelite.api.ItemContainer; import net.runelite.api.ItemID; import net.runelite.api.MenuAction; import net.runelite.api.ObjectID; -import static net.runelite.api.ObjectID.CANNON_BASE; import net.runelite.api.Player; import net.runelite.api.Projectile; import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.GameObjectSpawned; @@ -79,6 +80,11 @@ public class CannonPlugin extends Plugin static final int MAX_OVERLAY_DISTANCE = 4100; static final int MAX_CBALLS = 30; + private static final Set CANNONBALL_PROJECTILE_IDS = ImmutableSet.of( + GraphicID.CANNONBALL, GraphicID.GRANITE_CANNONBALL, + GraphicID.CANNONBALL_OR, GraphicID.GRANITE_CANNONBALL_OR + ); + private CannonCounter counter; private boolean skipProjectileCheckThisTick; private boolean cannonBallNotificationSent; @@ -92,7 +98,7 @@ public class CannonPlugin extends Plugin private boolean cannonPlaced; @Getter - private WorldPoint cannonPosition; + private WorldArea cannonPosition; @Getter private int cannonWorld = -1; @@ -185,15 +191,19 @@ public class CannonPlugin extends Plugin switch (item.getId()) { case ItemID.CANNON_BASE: + case ItemID.CANNON_BASE_OR: hasBase = true; break; case ItemID.CANNON_STAND: + case ItemID.CANNON_STAND_OR: hasStand = true; break; case ItemID.CANNON_BARRELS: + case ItemID.CANNON_BARRELS_OR: hasBarrels = true; break; case ItemID.CANNON_FURNACE: + case ItemID.CANNON_FURNACE_OR: hasFurnace = true; break; } @@ -253,12 +263,12 @@ public class CannonPlugin extends Plugin GameObject gameObject = event.getGameObject(); Player localPlayer = client.getLocalPlayer(); - if (gameObject.getId() == CANNON_BASE && !cannonPlaced) + if ((gameObject.getId() == ObjectID.CANNON_BASE || gameObject.getId() == ObjectID.CANNON_BASE_43029) && !cannonPlaced) { if (localPlayer.getWorldLocation().distanceTo(gameObject.getWorldLocation()) <= 2 && localPlayer.getAnimation() == AnimationID.BURYING_BONES) { - cannonPosition = gameObject.getWorldLocation(); + cannonPosition = buildCannonWorldArea(gameObject.getWorldLocation()); cannonWorld = client.getWorld(); cannon = gameObject; } @@ -268,7 +278,7 @@ public class CannonPlugin extends Plugin @Subscribe public void onMenuOptionClicked(MenuOptionClicked event) { - if (cannonPosition != null || event.getId() != ObjectID.DWARF_MULTICANNON) + if (cannonPosition != null || (event.getId() != ObjectID.DWARF_MULTICANNON && event.getId() != ObjectID.DWARF_MULTICANNON_43027)) { return; } @@ -303,12 +313,12 @@ public class CannonPlugin extends Plugin { Projectile projectile = event.getProjectile(); - if ((projectile.getId() == CANNONBALL || projectile.getId() == GRANITE_CANNONBALL) && cannonPosition != null && cannonWorld == client.getWorld()) + if (CANNONBALL_PROJECTILE_IDS.contains(projectile.getId()) && cannonPosition != null && cannonWorld == client.getWorld()) { WorldPoint projectileLoc = WorldPoint.fromLocal(client, projectile.getX1(), projectile.getY1(), client.getPlane()); //Check to see if projectile x,y is 0 else it will continuously decrease while ball is flying. - if (projectileLoc.equals(cannonPosition) && projectile.getX() == 0 && projectile.getY() == 0) + if (cannonPosition.contains(projectileLoc) && projectile.getX() == 0 && projectile.getY() == 0) { // When there's a chat message about cannon reloaded/unloaded/out of ammo, // the message event runs before the projectile event. However they run @@ -393,7 +403,7 @@ public class CannonPlugin extends Plugin cannonPlaced = true; cannonWorld = client.getWorld(); cannon = objects[0]; - cannonPosition = cannon.getWorldLocation(); + cannonPosition = buildCannonWorldArea(cannon.getWorldLocation()); } } } @@ -514,4 +524,9 @@ public class CannonPlugin extends Plugin infoBoxManager.removeInfoBox(counter); counter = null; } + + private static WorldArea buildCannonWorldArea(WorldPoint worldPoint) + { + return new WorldArea(worldPoint.getX() - 1, worldPoint.getY() - 1, 3, 3, worldPoint.getPlane()); + } }