package tc.oc.commons.bukkit.util; import javax.annotation.Nonnull; import org.bukkit.Location; import org.bukkit.util.Vector; import tc.oc.commons.core.util.Numbers; public class Vectors { public static final Vector ZERO = new Vector(); public static final Vector NEGATIVE_INFINITY = new Vector(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY); public static final Vector POSITIVE_INFINITY = new Vector(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY); private Vectors() {} public static @Nonnull Vector calculateLookVector(@Nonnull Location location) { double pitch = Math.toRadians(location.getPitch()); double yaw = Math.toRadians(location.getYaw()); Vector normal = new Vector( -(Math.cos(pitch) * Math.sin(yaw)), -Math.sin(pitch), Math.cos(pitch) * Math.cos(yaw) ); return normal; } public static String format(Vector v) { return format(v, "%f"); } public static String format(Vector v, String format) { return String.format(format + ", " + format + ", " + format, v.getX(), v.getY(), v.getZ()); } public static Vector parseVector(String text) throws NumberFormatException { String[] components = text.trim().split("\\s*,\\s*"); if(components.length != 3) { throw new NumberFormatException("Invalid vector '" + text + "'"); } return new Vector(Numbers.parse(components[0], Double.class, true), Numbers.parse(components[1], Double.class, true), Numbers.parse(components[2], Double.class, true)); } }