156 lines
4.5 KiB
Java
156 lines
4.5 KiB
Java
package net.minecraft.world.level;
|
|
|
|
import java.util.Spliterator;
|
|
import java.util.stream.StreamSupport;
|
|
import java.util.function.Consumer;
|
|
import javax.annotation.Nullable;
|
|
import java.util.Spliterators;
|
|
import java.util.stream.Stream;
|
|
import net.minecraft.core.BlockPos;
|
|
|
|
public class ChunkPos {
|
|
public static final long INVALID_CHUNK_POS;
|
|
public final int x;
|
|
public final int z;
|
|
|
|
public ChunkPos(final int integer1, final int integer2) {
|
|
this.x = integer1;
|
|
this.z = integer2;
|
|
}
|
|
|
|
public ChunkPos(final BlockPos fk) {
|
|
this.x = fk.getX() >> 4;
|
|
this.z = fk.getZ() >> 4;
|
|
}
|
|
|
|
public ChunkPos(final long long1) {
|
|
this.x = (int)long1;
|
|
this.z = (int)(long1 >> 32);
|
|
}
|
|
|
|
public long toLong() {
|
|
return asLong(this.x, this.z);
|
|
}
|
|
|
|
public static long asLong(final int integer1, final int integer2) {
|
|
return ((long)integer1 & 0xFFFFFFFFL) | ((long)integer2 & 0xFFFFFFFFL) << 32;
|
|
}
|
|
|
|
public static int getX(final long long1) {
|
|
return (int)(long1 & 0xFFFFFFFFL);
|
|
}
|
|
|
|
public static int getZ(final long long1) {
|
|
return (int)(long1 >>> 32 & 0xFFFFFFFFL);
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
final int integer2 = 1664525 * this.x + 1013904223;
|
|
final int integer3 = 1664525 * (this.z ^ 0xDEADBEEF) + 1013904223;
|
|
return integer2 ^ integer3;
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(final Object object) {
|
|
if (this == object) {
|
|
return true;
|
|
}
|
|
if (object instanceof ChunkPos) {
|
|
final ChunkPos bje3 = (ChunkPos)object;
|
|
return this.x == bje3.x && this.z == bje3.z;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public int getMinBlockX() {
|
|
return this.x << 4;
|
|
}
|
|
|
|
public int getMinBlockZ() {
|
|
return this.z << 4;
|
|
}
|
|
|
|
public int getMaxBlockX() {
|
|
return (this.x << 4) + 15;
|
|
}
|
|
|
|
public int getMaxBlockZ() {
|
|
return (this.z << 4) + 15;
|
|
}
|
|
|
|
public int getRegionX() {
|
|
return this.x >> 5;
|
|
}
|
|
|
|
public int getRegionZ() {
|
|
return this.z >> 5;
|
|
}
|
|
|
|
public int getRegionLocalX() {
|
|
return this.x & 0x1F;
|
|
}
|
|
|
|
public int getRegionLocalZ() {
|
|
return this.z & 0x1F;
|
|
}
|
|
|
|
public BlockPos getBlockAt(final int integer1, final int integer2, final int integer3) {
|
|
return new BlockPos((this.x << 4) + integer1, integer2, (this.z << 4) + integer3);
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return "[" + this.x + ", " + this.z + "]";
|
|
}
|
|
|
|
public BlockPos getWorldPosition() {
|
|
return new BlockPos(this.x << 4, 0, this.z << 4);
|
|
}
|
|
|
|
public int getChessboardDistance(final ChunkPos bje) {
|
|
return Math.max(Math.abs(this.x - bje.x), Math.abs(this.z - bje.z));
|
|
}
|
|
|
|
public static Stream<ChunkPos> rangeClosed(final ChunkPos bje, final int integer) {
|
|
return rangeClosed(new ChunkPos(bje.x - integer, bje.z - integer), new ChunkPos(bje.x + integer, bje.z + integer));
|
|
}
|
|
|
|
public static Stream<ChunkPos> rangeClosed(final ChunkPos bje1, final ChunkPos bje2) {
|
|
final int integer3 = Math.abs(bje1.x - bje2.x) + 1;
|
|
final int integer4 = Math.abs(bje1.z - bje2.z) + 1;
|
|
final int integer5 = (bje1.x < bje2.x) ? 1 : -1;
|
|
final int integer6 = (bje1.z < bje2.z) ? 1 : -1;
|
|
return StreamSupport.<ChunkPos>stream((Spliterator<ChunkPos>)new Spliterators.AbstractSpliterator<ChunkPos>((long)(integer3 * integer4), 64) {
|
|
@Nullable
|
|
private ChunkPos pos;
|
|
|
|
@Override
|
|
public boolean tryAdvance(final Consumer<? super ChunkPos> consumer) {
|
|
if (this.pos == null) {
|
|
this.pos = bje1;
|
|
}
|
|
else {
|
|
final int integer3 = this.pos.x;
|
|
final int integer4 = this.pos.z;
|
|
if (integer3 == bje2.x) {
|
|
if (integer4 == bje2.z) {
|
|
return false;
|
|
}
|
|
this.pos = new ChunkPos(bje1.x, integer4 + integer6);
|
|
}
|
|
else {
|
|
this.pos = new ChunkPos(integer3 + integer5, integer4);
|
|
}
|
|
}
|
|
consumer.accept(this.pos);
|
|
return true;
|
|
}
|
|
}, false);
|
|
}
|
|
|
|
static {
|
|
INVALID_CHUNK_POS = asLong(1875016, 1875016);
|
|
}
|
|
}
|