From b319d74f8d273ffabc89befc99021e848156d946 Mon Sep 17 00:00:00 2001 From: Frederik Engels Date: Sun, 14 Jan 2018 09:11:18 -0500 Subject: [PATCH] Track projectile target and spawn cycle. Add to api with rest of mapings. --- .../main/java/net/runelite/api/Client.java | 5 ++ .../java/net/runelite/api/Projectile.java | 48 +++++++++- .../net/runelite/mixins/RSClientMixin.java | 42 +++++++-- .../runelite/mixins/RSProjectileMixin.java | 90 +++++++++++++++++++ .../java/net/runelite/rs/api/RSClient.java | 4 + .../net/runelite/rs/api/RSProjectile.java | 66 +++++++++++++- 6 files changed, 247 insertions(+), 8 deletions(-) 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 228d6355c9..d45f55f89d 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -154,6 +154,8 @@ public interface Client IndexedSprite[] getMapScene(); + int getGameCycle(); + SpritePixels[] getMapIcons(); IndexedSprite[] getModIcons(); @@ -169,4 +171,7 @@ public interface Client boolean isClanMember(String name); Point getSceneDestinationLocation(); + + List getProjectiles(); + } diff --git a/runelite-api/src/main/java/net/runelite/api/Projectile.java b/runelite-api/src/main/java/net/runelite/api/Projectile.java index bad70f9717..2497dfe248 100644 --- a/runelite-api/src/main/java/net/runelite/api/Projectile.java +++ b/runelite-api/src/main/java/net/runelite/api/Projectile.java @@ -24,9 +24,55 @@ */ package net.runelite.api; -public interface Projectile +import java.time.Duration; + +public interface Projectile extends Renderable { int getId(); Actor getInteracting(); + + Point getTarget(); + + int getTargetZ(); + + int getX1(); + + int getY1(); + + int getFloor(); + + int getHeight(); + + int getEndHeight(); + + int getStartMovementCycle(); + + int getSpawnCycle(); + + int getCycleLength(); + + Duration getLength(); + + int getEndCycle(); + + int getRemainingCycles(); + + int getSlope(); + + int getStartHeight(); + + double getX(); + + double getY(); + + double getZ(); + + double getScalar(); + + double getVelocityX(); + + double getVelocityY(); + + double getVelocityZ(); } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index b30e4cca72..b29ea0fed8 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -32,17 +32,13 @@ import net.runelite.api.IndexedSprite; import net.runelite.api.MenuAction; import net.runelite.api.MenuEntry; import net.runelite.api.NPC; +import net.runelite.api.Node; import net.runelite.api.Player; import net.runelite.api.Point; import net.runelite.api.Prayer; +import net.runelite.api.Projectile; import net.runelite.api.Skill; import net.runelite.api.Varbits; -import net.runelite.api.mixins.FieldHook; -import net.runelite.api.mixins.Inject; -import net.runelite.api.mixins.Mixin; -import net.runelite.api.mixins.Shadow; -import net.runelite.api.widgets.Widget; -import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.events.ClanMembersChanged; import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameStateChanged; @@ -50,8 +46,15 @@ import net.runelite.api.events.MapRegionChanged; import net.runelite.api.events.PlayerMenuOptionsChanged; import net.runelite.api.events.ResizeableChanged; import net.runelite.api.events.VarbitChanged; +import net.runelite.api.mixins.FieldHook; +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Shadow; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import static net.runelite.client.callback.Hooks.eventBus; import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSDeque; import net.runelite.rs.api.RSIndexedSprite; import net.runelite.rs.api.RSWidget; @@ -331,6 +334,33 @@ public abstract class RSClientMixin implements RSClient setMenuOptionCount(count); } + @Inject + @Override + public List getProjectiles() + { + List projectiles = new ArrayList(); + RSDeque projectileDeque = this.getProjectilesDeque(); + Node head = projectileDeque.getHead(); + Node current = head; + + while (current != null) + { + if (current instanceof Projectile) + { + projectiles.add((Projectile) current); + } + + current = current.getNext(); + + if (current == head) + { + break; + } + } + + return projectiles; + } + @Inject @Override public void setModIcons(IndexedSprite[] modIcons) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java index 20113ddb2a..94e2a71d44 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java @@ -24,9 +24,13 @@ */ package net.runelite.mixins; +import java.time.Duration; import net.runelite.api.Actor; +import net.runelite.api.Point; +import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSNPC; @@ -39,6 +43,74 @@ public abstract class RSProjectileMixin implements RSProjectile @Shadow("clientInstance") private static RSClient client; + @Inject + private int targetX; + + @Inject + private int targetY; + + @Inject + private int targetZ; + + @Inject + Integer spawnCycle; + + @Inject + @Override + public Point getTarget() + { + if (targetX == -1 || targetY == -1) + { + return null; + } + + return new Point(targetX, targetY); + } + + @Inject + @Override + public int getTargetZ() + { + return targetZ; + } + + @Inject + @Override + public int getSpawnCycle() + { + return spawnCycle == null ? -1 : spawnCycle; + } + + /** + * the cycles returned are for the amount of time moving this works + * better with the projectile movement event as it only gets called + * after the projectile starts moving + * + * @return total time projectile will move for in gamecycles + */ + @Inject + @Override + public int getCycleLength() + { + return getEndCycle() - getSpawnCycle(); + } + + @Inject + @Override + public Duration getLength() + { + return Duration.ofMillis(getCycleLength() * 20); + } + + @Inject + @Override + public int getRemainingCycles() + { + int currentGameCycle = client.getGameCycle(); + + return getEndCycle() - currentGameCycle; + } + @Inject @Override public Actor getInteracting() @@ -68,4 +140,22 @@ public abstract class RSProjectileMixin implements RSProjectile return players[idx]; } } + + @Copy("moveProjectile") + abstract void moveProjectile(int targetX, int targetY, int targetZ, int gameCycle); + + @Replace("moveProjectile") + public void rl$moveProjectile(int targetX, int targetY, int targetZ, int gameCycle) + { + this.targetX = targetX; + this.targetY = targetY; + this.targetZ = targetZ; + + if (spawnCycle == null) + { + spawnCycle = client.getGameCycle(); + } + + moveProjectile(targetX, targetY, targetZ, gameCycle); + } } 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 cd1204a89d..8ba50a7812 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 @@ -146,6 +146,9 @@ public interface RSClient extends RSGameEngine, Client @Import("groundItemDeque") RSDeque[][][] getGroundItemDeque(); + @Import("projectiles") + RSDeque getProjectilesDeque(); + @Import("username") @Override String getUsername(); @@ -266,6 +269,7 @@ public interface RSClient extends RSGameEngine, Client boolean isMenuOpen(); @Import("gameCycle") + @Override int getGameCycle(); @Import("packetHandler") diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSProjectile.java b/runescape-api/src/main/java/net/runelite/rs/api/RSProjectile.java index 1a5e1f6e8f..db90a83067 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSProjectile.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSProjectile.java @@ -27,7 +27,7 @@ package net.runelite.rs.api; import net.runelite.api.Projectile; import net.runelite.mapping.Import; -public interface RSProjectile extends Projectile +public interface RSProjectile extends RSRenderable, Projectile { @Import("id") @Override @@ -35,4 +35,68 @@ public interface RSProjectile extends Projectile @Import("interacting") int getRsInteracting(); + + @Import("height") + @Override + int getHeight(); + + @Import("endHeight") + @Override + int getEndHeight(); + + @Import("x1") + @Override + int getX1(); + + @Import("y1") + @Override + int getY1(); + + @Import("floor") + @Override + int getFloor(); + + @Import("startMovementCycle") + @Override + int getStartMovementCycle(); + + @Import("endCycle") + @Override + int getEndCycle(); + + @Import("slope") + @Override + int getSlope(); + + @Import("startHeight") + @Override + int getStartHeight(); + + @Import("x") + @Override + double getX(); + + @Import("y") + @Override + double getY(); + + @Import("z") + @Override + double getZ(); + + @Import("scalar") + @Override + double getScalar(); + + @Import("velocityX") + @Override + double getVelocityX(); + + @Import("velocityY") + @Override + double getVelocityY(); + + @Import("velocityZ") + @Override + double getVelocityZ(); }