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

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