1
0
Fork 0
mirror of https://github.com/PaperMC/Paper.git synced 2025-02-18 11:22:15 +01:00

Added BlockVector a la WorldEdit as requested by . This BlockVector is safe to be used as keys in hash sets and hash maps, but it is mutable and careful attention must be paid to not modify the vector post-insertion into a set or map.

By: sk89q <the.sk89q@gmail.com>
This commit is contained in:
Bukkit/Spigot 2011-02-05 23:20:06 -08:00
parent 3a3e1144dc
commit 98a9148cf0
2 changed files with 116 additions and 0 deletions
paper-api/src/main/java/org/bukkit/util

View file

@ -0,0 +1,107 @@
package org.bukkit.util;
/**
* A vector with a hash function that floors the X, Y, Z components, a la
* BlockVector in WorldEdit. BlockVectors can be used in hash sets and
* hash maps. Be aware that BlockVectors are mutable, but it is important
* that BlockVectors are never changed once put into a hash set or hash map.
*
* @author sk89q
*/
public class BlockVector extends Vector {
/**
* Construct the vector with all components as 0.
*/
public BlockVector() {
this.x = 0;
this.y = 0;
this.z = 0;
}
/**
* Construct the vector with another vector.
*/
public BlockVector(Vector vec) {
this.x = vec.getX();
this.y = vec.getY();
this.z = vec.getZ();
}
/**
* Construct the vector with provided integer components.
*
* @param x
* @param y
* @param z
*/
public BlockVector(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
/**
* Construct the vector with provided double components.
*
* @param x
* @param y
* @param z
*/
public BlockVector(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
/**
* Construct the vector with provided float components.
*
* @param x
* @param y
* @param z
*/
public BlockVector(float x, float y, float z) {
this.x = x;
this.y = y;
this.z = z;
}
/**
* Checks if another object is equivalent.
*
* @param obj
* @return whether the other object is equivalent
*/
@Override
public boolean equals(Object obj) {
if (!(obj instanceof BlockVector)) {
return false;
}
BlockVector other = (BlockVector)obj;
return (int)other.getX() == (int)this.x && (int)other.getY() == (int)this.y
&& (int)other.getZ() == (int)this.z;
}
/**
* Returns a hash code for this vector.
*
* @return hash code
*/
@Override
public int hashCode() {
return (Integer.valueOf((int)x).hashCode() >> 13) ^
(Integer.valueOf((int)y).hashCode() >> 7) ^
Integer.valueOf((int)z).hashCode();
}
/**
* Get a new block vector.
*
* @return vector
*/
@Override
public BlockVector clone() {
return new BlockVector(x, y, z);
}
}

View file

@ -563,6 +563,15 @@ public class Vector implements Cloneable {
public Location toLocation(World world, float yaw, float pitch) {
return new Location(world, x, y, z, yaw, pitch);
}
/**
* Get the block vector of this vector.
*
* @return
*/
public BlockVector toBlockVector() {
return new BlockVector(x, y, z);
}
/**
* Get the threshold used for equals().