World: Chunk: use enum to store biome data format

This commit is contained in:
Matthias Schiffer 2021-12-04 00:03:47 +01:00
parent 21966252ea
commit 9ee1007ade
Signed by: neocturne
GPG key ID: 16EF3F64CB201D9C
2 changed files with 23 additions and 11 deletions

View file

@ -28,14 +28,18 @@ Chunk::Chunk(const ChunkData *data) {
auto biomesIntArray = level->get<NBT::IntArrayTag>("Biomes");
auto biomesByteArray = level->get<NBT::ByteArrayTag>("Biomes");
if (biomesIntArray && biomesIntArray->getLength() == BSIZE*BSIZE*BMAXY)
if (biomesIntArray && biomesIntArray->getLength() == BSIZE*BSIZE*BMAXY) {
biomeInts = std::move(biomesIntArray);
else if (biomesIntArray && biomesIntArray->getLength() == SIZE*SIZE)
biomeIntsPre115 = std::move(biomesIntArray);
else if (biomesByteArray && biomesByteArray->getLength() == SIZE*SIZE)
biomeFormat = INT_ARRAY;
} else if (biomesIntArray && biomesIntArray->getLength() == SIZE*SIZE) {
biomeInts = std::move(biomesIntArray);
biomeFormat = INT_ARRAY_PRE1_15;
} else if (biomesByteArray && biomesByteArray->getLength() == SIZE*SIZE) {
biomeBytes = std::move(biomesByteArray);
else
biomeFormat = BYTE_ARRAY;
} else {
throw std::invalid_argument("corrupt biome data");
}
auto dataVersionTag = data->getRoot()->get<NBT::IntTag>("DataVersion");
uint32_t dataVersion = dataVersionTag ? dataVersionTag->getValue() : 0;
@ -53,14 +57,16 @@ uint8_t Chunk::getBiome(block_idx_t x, y_idx_t y, block_idx_t z) const {
if (x > SIZE || y > MAXY || z > SIZE)
throw std::invalid_argument("corrupt chunk data");
if (biomeInts)
switch (biomeFormat) {
case INT_ARRAY:
return biomeInts->getValue((y>>BSHIFT)*BSIZE*BSIZE + (z>>BSHIFT)*BSIZE + (x>>BSHIFT));
else if (biomeIntsPre115)
return biomeIntsPre115->getValue(z*SIZE + x);
else if (biomeBytes)
case INT_ARRAY_PRE1_15:
return biomeInts->getValue(z*SIZE + x);
case BYTE_ARRAY:
return biomeBytes->getValue(z*SIZE + x);
else
default:
return 0xff;
}
}
Block Chunk::getBlock(block_idx_t x, Chunk::Height height, block_idx_t z) const {

View file

@ -57,8 +57,14 @@ public:
private:
std::vector<std::unique_ptr<Section>> sections;
enum BiomeFormat {
UNKNOWN = 0,
BYTE_ARRAY,
INT_ARRAY_PRE1_15,
INT_ARRAY,
} biomeFormat = UNKNOWN;
std::shared_ptr<const NBT::ByteArrayTag> biomeBytes;
std::shared_ptr<const NBT::IntArrayTag> biomeIntsPre115;
std::shared_ptr<const NBT::IntArrayTag> biomeInts;
bool getHeight(