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(); IndexedSprite[] getMapScene();
int getGameCycle();
SpritePixels[] getMapIcons(); SpritePixels[] getMapIcons();
IndexedSprite[] getModIcons(); IndexedSprite[] getModIcons();
@@ -169,4 +171,7 @@ public interface Client
boolean isClanMember(String name); boolean isClanMember(String name);
Point getSceneDestinationLocation(); Point getSceneDestinationLocation();
List<Projectile> getProjectiles();
} }

View File

@@ -24,9 +24,55 @@
*/ */
package net.runelite.api; package net.runelite.api;
public interface Projectile import java.time.Duration;
public interface Projectile extends Renderable
{ {
int getId(); int getId();
Actor getInteracting(); 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.MenuAction;
import net.runelite.api.MenuEntry; import net.runelite.api.MenuEntry;
import net.runelite.api.NPC; import net.runelite.api.NPC;
import net.runelite.api.Node;
import net.runelite.api.Player; import net.runelite.api.Player;
import net.runelite.api.Point; import net.runelite.api.Point;
import net.runelite.api.Prayer; import net.runelite.api.Prayer;
import net.runelite.api.Projectile;
import net.runelite.api.Skill; import net.runelite.api.Skill;
import net.runelite.api.Varbits; 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.ClanMembersChanged;
import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.ExperienceChanged;
import net.runelite.api.events.GameStateChanged; 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.PlayerMenuOptionsChanged;
import net.runelite.api.events.ResizeableChanged; import net.runelite.api.events.ResizeableChanged;
import net.runelite.api.events.VarbitChanged; 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 static net.runelite.client.callback.Hooks.eventBus;
import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSDeque;
import net.runelite.rs.api.RSIndexedSprite; import net.runelite.rs.api.RSIndexedSprite;
import net.runelite.rs.api.RSWidget; import net.runelite.rs.api.RSWidget;
@@ -331,6 +334,33 @@ public abstract class RSClientMixin implements RSClient
setMenuOptionCount(count); 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 @Inject
@Override @Override
public void setModIcons(IndexedSprite[] modIcons) public void setModIcons(IndexedSprite[] modIcons)

View File

@@ -24,9 +24,13 @@
*/ */
package net.runelite.mixins; package net.runelite.mixins;
import java.time.Duration;
import net.runelite.api.Actor; 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.Inject;
import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Replace;
import net.runelite.api.mixins.Shadow; import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSNPC; import net.runelite.rs.api.RSNPC;
@@ -39,6 +43,74 @@ public abstract class RSProjectileMixin implements RSProjectile
@Shadow("clientInstance") @Shadow("clientInstance")
private static RSClient client; 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 @Inject
@Override @Override
public Actor getInteracting() public Actor getInteracting()
@@ -68,4 +140,22 @@ public abstract class RSProjectileMixin implements RSProjectile
return players[idx]; 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") @Import("groundItemDeque")
RSDeque[][][] getGroundItemDeque(); RSDeque[][][] getGroundItemDeque();
@Import("projectiles")
RSDeque getProjectilesDeque();
@Import("username") @Import("username")
@Override @Override
String getUsername(); String getUsername();
@@ -266,6 +269,7 @@ public interface RSClient extends RSGameEngine, Client
boolean isMenuOpen(); boolean isMenuOpen();
@Import("gameCycle") @Import("gameCycle")
@Override
int getGameCycle(); int getGameCycle();
@Import("packetHandler") @Import("packetHandler")

View File

@@ -27,7 +27,7 @@ package net.runelite.rs.api;
import net.runelite.api.Projectile; import net.runelite.api.Projectile;
import net.runelite.mapping.Import; import net.runelite.mapping.Import;
public interface RSProjectile extends Projectile public interface RSProjectile extends RSRenderable, Projectile
{ {
@Import("id") @Import("id")
@Override @Override
@@ -35,4 +35,68 @@ public interface RSProjectile extends Projectile
@Import("interacting") @Import("interacting")
int getRsInteracting(); 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();
} }