minecraft-src/net/minecraft/world/level/chunk/CarvingMask.java
2025-07-04 01:41:11 +03:00

55 lines
1.3 KiB
Java

package net.minecraft.world.level.chunk;
import java.util.BitSet;
import java.util.stream.Stream;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.ChunkPos;
public class CarvingMask {
private final int minY;
private final BitSet mask;
private CarvingMask.Mask additionalMask = (i, j, k) -> false;
public CarvingMask(int mask, int minY) {
this.minY = minY;
this.mask = new BitSet(256 * mask);
}
public void setAdditionalMask(CarvingMask.Mask additionalMask) {
this.additionalMask = additionalMask;
}
public CarvingMask(long[] mask, int minY) {
this.minY = minY;
this.mask = BitSet.valueOf(mask);
}
private int getIndex(int x, int y, int z) {
return x & 15 | (z & 15) << 4 | y - this.minY << 8;
}
public void set(int x, int y, int z) {
this.mask.set(this.getIndex(x, y, z));
}
public boolean get(int x, int y, int z) {
return this.additionalMask.test(x, y, z) || this.mask.get(this.getIndex(x, y, z));
}
public Stream<BlockPos> stream(ChunkPos pos) {
return this.mask.stream().mapToObj(i -> {
int j = i & 15;
int k = i >> 4 & 15;
int l = i >> 8;
return pos.getBlockAt(j, l + this.minY, k);
});
}
public long[] toArray() {
return this.mask.toLongArray();
}
public interface Mask {
boolean test(int i, int j, int k);
}
}