opac-bluemap-integration/src/main/java/io/github/gaming32/opacbluemapintegration/ChunkPosDirection.java
2025-10-03 19:14:01 +03:00

58 lines
1.5 KiB
Java

package io.github.gaming32.opacbluemapintegration;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.ChunkPos;
public enum ChunkPosDirection {
LEFT(-1, 0),
FORWARD(0, 1),
RIGHT(1, 0),
BACKWARD(0, -1);
public final int x, z;
public final ChunkPos value;
ChunkPosDirection(int x, int z) {
this.x = x;
this.z = z;
this.value = new ChunkPos(x, z);
}
public ChunkPosDirection getLeft() {
return rotate(-1);
}
public ChunkPosDirection getRight() {
return rotate(1);
}
public ChunkPosDirection getOpposite() {
return rotate(2);
}
public ChunkPosDirection rotate(int clockwiseDistance) {
return values()[(ordinal() + clockwiseDistance) & 3];
}
public ChunkPos add(ChunkPos pos) {
return new ChunkPos(pos.x + x, pos.z + z);
}
public int getEdge(ChunkPos pos) {
return switch (this) {
case LEFT -> pos.getMinBlockX();
case FORWARD -> pos.getMaxBlockZ() + 1;
case RIGHT -> pos.getMaxBlockX() + 1;
case BACKWARD -> pos.getMinBlockZ();
};
}
public static BlockPos getCorner(ChunkPos pos, ChunkPosDirection a, ChunkPosDirection b) {
if (a == b || a.getOpposite() == b) {
throw new IllegalArgumentException("Corner can't be accessed with opposite directions");
}
return a.x != 0
? new BlockPos(a.getEdge(pos), 0, b.getEdge(pos))
: new BlockPos(b.getEdge(pos), 0, a.getEdge(pos));
}
}