package com.bergerkiller.bukkit.common.bases.mutable; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Entity; import org.bukkit.util.Vector; import com.bergerkiller.bukkit.common.bases.IntVector2; import com.bergerkiller.bukkit.common.entity.CommonEntity; import com.bergerkiller.bukkit.common.utils.EntityUtil; import com.bergerkiller.bukkit.common.utils.MathUtil; public abstract class VectorXZAbstract { public final DoubleAbstract x = new DoubleAbstract() { public double get() {return VectorXZAbstract.this.getX();} public DoubleAbstract set(double value) {VectorXZAbstract.this.setX(value); return this;} }; public final DoubleAbstract z = new DoubleAbstract() { public double get() {return VectorXZAbstract.this.getZ();} public DoubleAbstract set(double value) {VectorXZAbstract.this.setZ(value); return this;} }; /** * Gets the X-component * * @return the X-component */ public abstract double getX(); /** * Gets the Z-component * * @return the Z-component */ public abstract double getZ(); /** * Sets the X-component * * @param x value to set to * @return this same instance */ public abstract VectorXZAbstract setX(double x); /** * Sets the Z-component * * @param z value to set to * @return this same instance */ public abstract VectorXZAbstract setZ(double z); public VectorXZAbstract setZero() { return setX(0.0).setZ(0.0); } public VectorXZAbstract set(double x, double z) { return setX(x).setZ(z); } public VectorXZAbstract set(VectorXZAbstract value) { return set(value.getX(), value.getZ()); } public IntVector2 floor() { return new IntVector2(x.getFloor(), z.getFloor()); } public IntVector2 toBlock() { return new IntVector2(x.block(), z.block()); } public VectorXZAbstract add(double x, double z) { return setX(getX() + x).setZ(getZ() + z); } public VectorXZAbstract add(Vector vector) { return add(vector.getX(), vector.getZ()); } public VectorXZAbstract add(VectorXZAbstract value) { return add(value.getX(), value.getZ()); } public VectorXZAbstract add(VectorXZAbstract value, double length) { return add(length * value.getX(), length * value.getZ()); } public VectorXZAbstract add(BlockFace face, double length) { return add(length * face.getModX(), length * face.getModZ()); } public VectorXZAbstract subtract(double x, double z) { return setX(getX() - x).setZ(getZ() - z); } public VectorXZAbstract subtract(Vector vector) { return subtract(vector.getX(), vector.getZ()); } public VectorXZAbstract subtract(VectorXZAbstract value) { return subtract(value.getX(), value.getZ()); } public VectorXZAbstract subtract(BlockFace face, double length) { return subtract(length * face.getModX(), length * face.getModZ()); } public VectorXZAbstract subtract(VectorXZAbstract value, double length) { return subtract(length * value.getX(), length * value.getZ()); } public VectorXZAbstract multiply(double mx, double mz) { return setX(getX() * mx).setZ(getZ() * mz); } public VectorXZAbstract multiply(Vector vector) { return multiply(vector.getX(), vector.getZ()); } public VectorXZAbstract multiply(double factor) { return multiply(factor, factor); } public VectorXZAbstract divide(double dx, double dz) { return setX(getX() / dx).setZ(getZ() / dz); } public VectorXZAbstract divide(Vector vector) { return divide(vector.getX(), vector.getZ()); } public VectorXZAbstract divide(double factor) { return divide(factor, factor); } public VectorXZAbstract fixNaN() { x.fixNaN(); z.fixNaN(); return this; } public VectorXZAbstract fixNaN(double defx, double defz) { x.fixNaN(defx); z.fixNaN(defz); return this; } public IntVector2 chunk() { return new IntVector2(x.chunk(), z.chunk()); } public double length() { return MathUtil.length(getX(), getZ()); } public double lengthSquared() { return MathUtil.lengthSquared(getX(), getZ()); } public double distance(double x, double z) { return MathUtil.distance(getX(), getZ(), x, z); } public double distanceSquared(double x, double z) { return MathUtil.distance(getX(), getZ(), x, z); } public double distance(VectorAbstract other) { return distance(other.getX(), other.getZ()); } public double distanceSquared(VectorAbstract other) { return distanceSquared(other.getX(), other.getZ()); } public double distance(VectorXZAbstract other) { return distance(other.getX(), other.getZ()); } public double distanceSquared(VectorXZAbstract other) { return distanceSquared(other.getX(), other.getZ()); } public double distance(Location other) { return distance(other.getX(), other.getZ()); } public double distanceSquared(Location other) { return distanceSquared(other.getX(), other.getZ()); } public double distance(Vector other) { return distance(other.getX(), other.getZ()); } public double distanceSquared(Vector other) { return distanceSquared(other.getX(), other.getZ()); } public double distance(Block block) { return distance(block.getX() + 0.5, block.getZ() + 0.5); } public double distanceSquared(Block block) { return distanceSquared(block.getX() + 0.5, block.getZ() + 0.5); } public double distance(Entity other) { return distance(EntityUtil.getLocX(other), EntityUtil.getLocZ(other)); } public double distanceSquared(Entity other) { return distanceSquared(EntityUtil.getLocX(other), EntityUtil.getLocZ(other)); } public double distance(CommonEntity<?> other) { return distance(other.loc); } public double distanceSquared(CommonEntity<?> other) { return distanceSquared(other.loc); } @Override public String toString() { return "{x=" + getX() + ", z=" + getZ() + "}"; } }