А что ты сделал то?
Как было все плохо, так и осталось.
Как был распухший до боли Region с IBlock[] массивом который сжирает сотни и тысячи мегабайт, так и осталось.
Теперь сравни с моим:
private final ByteBuffer types;
@Override
public int getNearestZ(int x, int y, int z) {
final int offset = getBlockOffset(x, y);
final byte type = types.get(offset);
return switch (type) {
case FLAT -> readFlatZ(offset + 1);
case COMPLEX -> readComplexZ(offset + 1, x, y, z);
////////..................
};
}