diff --git a/src/World/Chunk.cpp b/src/World/Chunk.cpp index fc0307e..8b4b9eb 100644 --- a/src/World/Chunk.cpp +++ b/src/World/Chunk.cpp @@ -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 { diff --git a/src/World/Chunk.hpp b/src/World/Chunk.hpp index cfae0f7..1a59efe 100644 --- a/src/World/Chunk.hpp +++ b/src/World/Chunk.hpp @@ -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(