Files
gauntlet/GauntletUtils.java
BuildTools c61f651853 Math Update
2019-07-30 01:11:52 -04:00

217 lines
6.4 KiB
Java

package net.runelite.client.plugins.gauntlet;
import net.runelite.api.Client;
import net.runelite.api.Model;
import net.runelite.api.NPC;
import net.runelite.api.Perspective;
import net.runelite.api.Point;
import net.runelite.api.Projectile;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.model.Jarvis;
import net.runelite.api.model.Vertex;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class GauntletUtils {
public static final int[] MELEE_ANIMATIONS = new int[]{
395, // Axe Slash
401, // Axe Crush
400, // Pick Crush
401, // Pick Stab
386, // Harpoon Stab
390, // Harpoon Slash
422, // Unarmed Punch
423, // Unarmed Kick
401, // Crystal Scepter
428, // Crystal Halberd Jab & Fend
440 // Crystal Halberd Swipe
};
public static final int[] RANGE_ANIMATIONS = new int[]{
426 // Crystal Bow
};
public static final int[] MAGE_ANIMATIONS = new int[]{
1167 // Crystal Staff
};
public static final int[] PLAYER_ANIMATIONS = concatIntArray(MELEE_ANIMATIONS, RANGE_ANIMATIONS, MAGE_ANIMATIONS);
public static final int[] CRYSTAL_DEPOSIT = new int[]{
36064, // Normal Mining Spot
35975 // Corrupted Mining Spot
};
public static final int[] PHREN_ROOTS = new int[]{
36066, // Normal Woodcutting Spot
35969 // Corrupted Woodcutting Spot
};
public static final int[] FISHING_SPOTS = new int[]{
36068, // Normal Fishing Spot
35967 // Corrupted Fishing Spot
};
public static final int[] GRYM_ROOTS = new int[]{
36070, // Normal Herblore Spot
35971 // Corrupted Herblore Spot
};
public static final int[] LINUM_TIRINUM = new int[]{
36072, // Normal Farming Spot
35973, // Corrupted Farming Spot
};
public static final int[] RESOURCE_IDS = concatIntArray(CRYSTAL_DEPOSIT, PHREN_ROOTS, FISHING_SPOTS, GRYM_ROOTS, LINUM_TIRINUM);
public static final int[] PROJECTILE_MAGIC = new int[]{1707, 1708};
public static final int[] PROJECTILE_RANGE = new int[]{1711, 1712};
public static final int[] PROJECTILE_PRAYER = new int[]{1713, 1714};
public static final int VARP_BOSS_ROOM = 9177;
public static final int VARP_RAID_ROOM = 9178;
public static final int BOSS_ANIMATION_LIGHTNING = 8418;
public static final int[] TORNADO_IDS = new int[]{9025, 9039};
public static final int TORNADO_TICKS = 20;
/**
* Concatenate all integers in the array into a single array.
*
* @param arrays array of int arrays
* @return int array
*/
public static int[] concatIntArray(int[]... arrays) {
int length = 0;
for (int[] array : arrays) {
length += array.length;
}
int[] returnArray = new int[length];
int currentIndex = 0;
for (int[] array : arrays) {
for (int value : array) {
returnArray[currentIndex] = value;
currentIndex++;
}
}
return returnArray;
}
/**
* Determines whether or not an integer array contains a specific value.
*
* @param intArray int[]
* @param value int
* @return boolean
*/
public static boolean arrayContainsInteger(int[] intArray, int value) {
for (int i : intArray)
if (i == value)
return true;
return false;
}
/**
* Returns whether or not a NPC is a tornado.
*
* @param npc NPC
* @return boolean
*/
public static boolean isTornado(NPC npc) {
return npc != null && arrayContainsInteger(TORNADO_IDS, npc.getId());
}
/**
* Returns whether or not a NPC is the boss.
*
* @param npc NPC
* @return boolean
*/
public static boolean isBoss(NPC npc) {
return npc != null && npc.getName() != null && npc.getName().matches("(Crystalline|Corrupted) Hunllef");
}
/**
* Returns whether or not the player is current in the Gauntlet.
*
* @param client Client
* @return boolean
*/
public static boolean inRaid(Client client) {
try {
return client.getVarbitValue(client.getVarps(), VARP_RAID_ROOM) == 1;
} catch (IndexOutOfBoundsException | NullPointerException ignored) {
return false;
}
}
/**
* Returns whether or not the player is currently in the boss room.
*
* @param client Client
* @return boolean
*/
public static boolean inBoss(Client client) {
try {
return client.getVarbitValue(client.getVarps(), VARP_BOSS_ROOM) == 1;
} catch (IndexOutOfBoundsException | NullPointerException ignored) {
return false;
}
}
public static Polygon boundProjectile(Client client, Projectile p) {
if (p == null || p.getModel() == null)
return null;
Model model = p.getModel();
LocalPoint point = new LocalPoint((int) p.getX(), (int) p.getY());
int tileHeight = Perspective.getTileHeight(client, point, client.getPlane());
double angle = Math.atan(p.getVelocityY() / p.getVelocityX());
angle = Math.toDegrees(angle) + (p.getVelocityX() < 0 ? 180 : 0);
angle = angle < 0 ? angle + 360 : angle;
angle = 360 - angle - 90;
double ori = angle * (512d / 90d);
ori = ori < 0 ? ori + 2048 : ori;
int orientation = (int) Math.round(ori);
List<Vertex> vertices = model.getVertices();
for (int i = 0; i < vertices.size(); ++i) {
vertices.set(i, vertices.get(i).rotate(orientation));
}
List<Point> list = new ArrayList<>();
for (final Vertex vertex : vertices) {
final Point localToCanvas = Perspective.localToCanvas(client, point.getX() - vertex.getX(), point.getY() - vertex.getZ(), tileHeight + vertex.getY() + (int) p.getZ());
if (localToCanvas != null) {
list.add(localToCanvas);
}
}
final List<Point> convexHull = Jarvis.convexHull(list);
if (convexHull == null)
return null;
final Polygon polygon = new Polygon();
for (final Point hullPoint : convexHull) {
polygon.addPoint(hullPoint.getX(), hullPoint.getY());
}
return polygon;
}
}