minecraft-src/net/minecraft/core/BlockBox.java
2025-07-04 01:41:11 +03:00

88 lines
2.5 KiB
Java

package net.minecraft.core;
import io.netty.buffer.ByteBuf;
import java.util.Iterator;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.phys.AABB;
public record BlockBox(BlockPos min, BlockPos max) implements Iterable<BlockPos> {
public static final StreamCodec<ByteBuf, BlockBox> STREAM_CODEC = new StreamCodec<ByteBuf, BlockBox>() {
public BlockBox decode(ByteBuf byteBuf) {
return new BlockBox(FriendlyByteBuf.readBlockPos(byteBuf), FriendlyByteBuf.readBlockPos(byteBuf));
}
public void encode(ByteBuf byteBuf, BlockBox blockBox) {
FriendlyByteBuf.writeBlockPos(byteBuf, blockBox.min());
FriendlyByteBuf.writeBlockPos(byteBuf, blockBox.max());
}
};
public BlockBox(final BlockPos min, final BlockPos max) {
this.min = BlockPos.min(min, max);
this.max = BlockPos.max(min, max);
}
public static BlockBox of(BlockPos pos) {
return new BlockBox(pos, pos);
}
public static BlockBox of(BlockPos pos1, BlockPos pos2) {
return new BlockBox(pos1, pos2);
}
public BlockBox include(BlockPos pos) {
return new BlockBox(BlockPos.min(this.min, pos), BlockPos.max(this.max, pos));
}
public boolean isBlock() {
return this.min.equals(this.max);
}
public boolean contains(BlockPos pos) {
return pos.getX() >= this.min.getX()
&& pos.getY() >= this.min.getY()
&& pos.getZ() >= this.min.getZ()
&& pos.getX() <= this.max.getX()
&& pos.getY() <= this.max.getY()
&& pos.getZ() <= this.max.getZ();
}
public AABB aabb() {
return AABB.encapsulatingFullBlocks(this.min, this.max);
}
public Iterator<BlockPos> iterator() {
return BlockPos.betweenClosed(this.min, this.max).iterator();
}
public int sizeX() {
return this.max.getX() - this.min.getX() + 1;
}
public int sizeY() {
return this.max.getY() - this.min.getY() + 1;
}
public int sizeZ() {
return this.max.getZ() - this.min.getZ() + 1;
}
public BlockBox extend(Direction direction, int amount) {
if (amount == 0) {
return this;
} else {
return direction.getAxisDirection() == Direction.AxisDirection.POSITIVE
? of(this.min, BlockPos.max(this.min, this.max.relative(direction, amount)))
: of(BlockPos.min(this.min.relative(direction, amount), this.max), this.max);
}
}
public BlockBox move(Direction direction, int amount) {
return amount == 0 ? this : new BlockBox(this.min.relative(direction, amount), this.max.relative(direction, amount));
}
public BlockBox offset(Vec3i vector) {
return new BlockBox(this.min.offset(vector), this.max.offset(vector));
}
}