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 #246. 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:
parent
3a3e1144dc
commit
98a9148cf0
2 changed files with 116 additions and 0 deletions
paper-api/src/main/java/org/bukkit/util
107
paper-api/src/main/java/org/bukkit/util/BlockVector.java
Normal file
107
paper-api/src/main/java/org/bukkit/util/BlockVector.java
Normal 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);
|
||||
}
|
||||
}
|
|
@ -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().
|
||||
|
|
Loading…
Add table
Reference in a new issue