Track projectile target and spawn cycle. Add to api with rest of mapings.

This commit is contained in:
Frederik Engels
2018-01-14 09:11:18 -05:00
committed by Adam
parent 66401296b8
commit b319d74f8d
6 changed files with 247 additions and 8 deletions

View File

@@ -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<Projectile> getProjectiles();
}

View File

@@ -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();
}

View File

@@ -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<Projectile> getProjectiles()
{
List<Projectile> projectiles = new ArrayList<Projectile>();
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)

View File

@@ -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);
}
}

View File

@@ -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")

View File

@@ -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();
}