package mekanism.api; import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; /** * Pos3D - a way of performing operations on objects in a three dimensional environment. * @author aidancbrady * */ public class Pos3D { public double xPos; public double yPos; public double zPos; public Pos3D() { this(0, 0, 0); } public Pos3D(double x, double y, double z) { xPos = x; yPos = y; zPos = z; } /** * Creates a Pos3D with an entity's posX, posY, and posZ values. * @param entity - entity to create the Pos3D from */ public Pos3D(Entity entity) { this(entity.posX, entity.posY, entity.posZ); } /** * Creates a Pos3D with a TileEntity's xCoord, yCoord and zCoord values. * @param tileEntity - TileEntity to create the Pos3D from */ public Pos3D(TileEntity tileEntity) { this(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); } /** * Creates and returns a Pos3D with values representing the difference between this and the Pos3D in the parameters. * @param pos - Pos3D to subtract * @return difference of the two Pos3Ds */ public Pos3D diff(Pos3D pos) { return new Pos3D(xPos-pos.xPos, yPos-pos.yPos, zPos-pos.zPos); } /** * Creates a new Pos3D from the motion of an entity. * @param entity * @return */ public static Pos3D fromMotion(Entity entity) { return new Pos3D(entity.motionX, entity.motionY, entity.motionZ); } /** * Translates this Pos3D by the defined values. * @param x - amount to translate on the x axis * @param y - amount to translate on the y axis * @param z - amount to translate on the z axis * @return the translated Pos3D */ public Pos3D translate(double x, double y, double z) { xPos += x; yPos += y; zPos += z; return this; } /** * Performs the same operation as translate(x, y, z), but with a Pos3D value instead. * @param pos - Pos3D value to translate by * @return translated Pos3D */ public Pos3D translate(Pos3D pos) { return translate(pos.xPos, pos.yPos, pos.zPos); } /** * Returns the distance between this and the defined Pos3D. * @param pos - the Pos3D to find the distance to * @return the distance between this and the defined Pos3D */ public double distance(Pos3D pos) { double subX = xPos - pos.xPos; double subY = yPos - pos.yPos; double subZ = zPos - pos.zPos; return MathHelper.sqrt_double(subX * subX + subY * subY + subZ * subZ); } /** * Rotates this Pos3D by the defined yaw value. * @param yaw - yaw to rotate by * @return rotated Pos3D */ public Pos3D rotateYaw(double yaw) { double yawRadians = Math.toRadians(yaw); double x = xPos; double z = zPos; if(yaw != 0) { xPos = x * Math.cos(yawRadians) - z * Math.sin(yawRadians); zPos = x * Math.sin(yawRadians) + z * Math.cos(yawRadians); } return this; } /** * Scales this Pos3D by the defined x, y, an z values. * @param x - x value to scale by * @param y - y value to scale by * @param z - z value to scale by * @return scaled Pos3D */ public Pos3D scale(double x, double y, double z) { xPos *= x; yPos *= y; zPos *= z; return this; } /** * Performs the same operation as scale(x, y, z), but with a value representing all three dimensions. * @param scale - value to scale by * @return scaled Pos3D */ public Pos3D scale(double scale) { return scale(scale, scale, scale); } @Override public Pos3D clone() { return new Pos3D(xPos, yPos, zPos); } @Override public String toString() { return "[Pos3D: " + xPos + ", " + yPos + ", " + zPos + "]"; } @Override public boolean equals(Object obj) { return obj instanceof Pos3D && ((Pos3D)obj).xPos == xPos && ((Pos3D)obj).yPos == yPos && ((Pos3D)obj).zPos == zPos; } @Override public int hashCode() { int code = 1; code = 31 * code + new Double(xPos).hashCode(); code = 31 * code + new Double(yPos).hashCode(); code = 31 * code + new Double(zPos).hashCode(); return code; } }