package me.eccentric_nz.TARDIS.utility;
/*
* Freeze players
*
* Copyright 2012 Kristian S. Stangeland (Comphenix)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
import org.bukkit.Location;
import org.bukkit.util.Vector;
public class TARDISVector3D {
/**
* Represents the null (0, 0, 0) origin.
*/
public static final TARDISVector3D ORIGIN = new TARDISVector3D(0, 0, 0);
// Use protected members, like Bukkit
public final double x;
public final double y;
public final double z;
/**
* Construct an immutable 3D vector.
*
* @param x
* @param y
* @param z
*/
public TARDISVector3D(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
/**
* Construct an immutable floating point 3D vector from a location object.
*
* @param location - the location to copy.
*/
public TARDISVector3D(Location location) {
this(location.toVector());
}
/**
* Construct an immutable floating point 3D vector from a mutable Bukkit
* vector.
*
* @param vector - the mutable real Bukkit vector to copy.
*/
public TARDISVector3D(Vector vector) {
if (vector == null) {
throw new IllegalArgumentException("Vector cannot be NULL.");
}
this.x = vector.getX();
this.y = vector.getY();
this.z = vector.getZ();
}
/**
* Convert this instance to an equivalent real 3D vector.
*
* @return Real 3D vector.
*/
public Vector toVector() {
return new Vector(x, y, z);
}
/**
* Adds the current vector and a given position vector, producing a result
* vector.
*
* @param other - the other vector.
* @return The new result vector.
*/
public TARDISVector3D add(TARDISVector3D other) {
if (other == null) {
throw new IllegalArgumentException("other cannot be NULL");
}
return new TARDISVector3D(x + other.x, y + other.y, z + other.z);
}
/**
* Adds the current vector and a given vector together, producing a result
* vector.
*
* @param x
* @param y
* @param z
* @return The new result vector.
*/
public TARDISVector3D add(double x, double y, double z) {
return new TARDISVector3D(this.x + x, this.y + y, this.z + z);
}
/**
* Substracts the current vector and a given vector, producing a result
* position.
*
* @param other - the other position.
* @return The new result position.
*/
public TARDISVector3D subtract(TARDISVector3D other) {
if (other == null) {
throw new IllegalArgumentException("other cannot be NULL");
}
return new TARDISVector3D(x - other.x, y - other.y, z - other.z);
}
/**
* Substracts the current vector and a given vector together, producing a
* result vector.
*
* @param x
* @param y
* @param z
* @return The new result vector.
*/
public TARDISVector3D subtract(double x, double y, double z) {
return new TARDISVector3D(this.x - x, this.y - y, this.z - z);
}
/**
* Multiply each dimension in the current vector by the given factor.
*
* @param factor - multiplier.
* @return The new result.
*/
public TARDISVector3D multiply(int factor) {
return new TARDISVector3D(x * factor, y * factor, z * factor);
}
/**
* Multiply each dimension in the current vector by the given factor.
*
* @param factor - multiplier.
* @return The new result.
*/
public TARDISVector3D multiply(double factor) {
return new TARDISVector3D(x * factor, y * factor, z * factor);
}
/**
* Divide each dimension in the current vector by the given divisor.
*
* @param divisor - the divisor.
* @return The new result.
*/
public TARDISVector3D divide(int divisor) {
if (divisor == 0) {
throw new IllegalArgumentException("Cannot divide by null.");
}
return new TARDISVector3D(x / divisor, y / divisor, z / divisor);
}
/**
* Divide each dimension in the current vector by the given divisor.
*
* @param divisor - the divisor.
* @return The new result.
*/
public TARDISVector3D divide(double divisor) {
if (divisor == 0) {
throw new IllegalArgumentException("Cannot divide by null.");
}
return new TARDISVector3D(x / divisor, y / divisor, z / divisor);
}
/**
* Retrieve the absolute value of this vector.
*
* @return The new result.
*/
public TARDISVector3D abs() {
return new TARDISVector3D(Math.abs(x), Math.abs(y), Math.abs(z));
}
@Override
public String toString() {
return String.format("[x: %s, y: %s, z: %s]", x, y, z);
}
}