Started Rewriting LinkData
Created NewLinkData and replaced references to the original LinkData. Moved it to the mod_pocketDim.core package. Added Point4D, an immutable point type for 3D integer coordinates with an added dimension ID.
This commit is contained in:
131
StevenDimDoors/mod_pocketDim/util/Point4D.java
Normal file
131
StevenDimDoors/mod_pocketDim/util/Point4D.java
Normal file
@@ -0,0 +1,131 @@
|
||||
package StevenDimDoors.mod_pocketDim.util;
|
||||
|
||||
public final class Point4D
|
||||
{
|
||||
private final int x;
|
||||
private final int y;
|
||||
private final int z;
|
||||
private final int dimension;
|
||||
|
||||
public Point4D(int x, int y, int z, int dimension)
|
||||
{
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
this.dimension = dimension;
|
||||
}
|
||||
|
||||
public int getX()
|
||||
{
|
||||
return x;
|
||||
}
|
||||
|
||||
public int getY()
|
||||
{
|
||||
return y;
|
||||
}
|
||||
|
||||
public int getZ()
|
||||
{
|
||||
return z;
|
||||
}
|
||||
|
||||
public int getDimension()
|
||||
{
|
||||
return dimension;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
//Time for some witchcraft.
|
||||
//The code here is inspired by a discussion on Stack Overflow regarding hash codes for 3D.
|
||||
//Source: http://stackoverflow.com/questions/9858376/hashcode-for-3d-integer-coordinates-with-high-spatial-coherence
|
||||
|
||||
//I believe that most of the time, any points we might be hashing will be in close proximity to each other.
|
||||
//For instance, points that are within the same chunk or within a few neighboring chunks. Only the low-order
|
||||
//bits of each component would differ. I'll use 8 bits from Y and the 12 bits from X and Z. ~SenseiKiwi
|
||||
|
||||
int bit;
|
||||
int hash;
|
||||
int index;
|
||||
|
||||
hash = 0;
|
||||
index = 0;
|
||||
for (bit = 0; bit < 8; bit++)
|
||||
{
|
||||
hash |= ((y >> bit) & 1) << index;
|
||||
index++;
|
||||
hash |= ((x >> bit) & 1) << index;
|
||||
index++;
|
||||
hash |= ((z >> bit) & 1) << index;
|
||||
index++;
|
||||
}
|
||||
for (; bit < 12; bit++)
|
||||
{
|
||||
hash |= ((x >> bit) & 1) << index;
|
||||
index++;
|
||||
hash |= ((z >> bit) & 1) << index;
|
||||
index++;
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
public long longHashCode()
|
||||
{
|
||||
//Time for some witchcraft.
|
||||
//The code here is inspired by a discussion on Stack Overflow regarding hash codes for 3D.
|
||||
//Source: http://stackoverflow.com/questions/9858376/hashcode-for-3d-integer-coordinates-with-high-spatial-coherence
|
||||
|
||||
//Use 8 bits from Y and 24 bits from X and Z. Mix in 8 bits from the destination dim ID too - that means
|
||||
//even if you aligned two doors perfectly between two pockets, it's unlikely they would lead to the same dungeon.
|
||||
|
||||
int bit;
|
||||
int index;
|
||||
long hash;
|
||||
|
||||
hash = 0;
|
||||
index = 0;
|
||||
for (bit = 0; bit < 8; bit++)
|
||||
{
|
||||
hash |= ((dimension >> bit) & 1) << index;
|
||||
index++;
|
||||
hash |= ((x >> bit) & 1) << index;
|
||||
index++;
|
||||
hash |= ((y >> bit) & 1) << index;
|
||||
index++;
|
||||
hash |= ((z >> bit) & 1) << index;
|
||||
index++;
|
||||
}
|
||||
for (; bit < 24; bit++)
|
||||
{
|
||||
hash |= ((x >> bit) & 1) << index;
|
||||
index++;
|
||||
hash |= ((z >> bit) & 1) << index;
|
||||
index++;
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj)
|
||||
{
|
||||
return equals((Point4D) obj);
|
||||
}
|
||||
|
||||
public boolean equals(Point4D other)
|
||||
{
|
||||
if (this == other)
|
||||
return true;
|
||||
if (other == null)
|
||||
return false;
|
||||
|
||||
return (x == other.x && y == other.y && z == other.z && dimension == other.dimension);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "(" + x + ", " + y + ", " + z + ", " + dimension + ")";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user