mirror of
https://github.com/neocturne/MinedMap.git
synced 2025-04-20 03:25:09 +02:00
World: Chunk: use enum to store biome data format
This commit is contained in:
parent
21966252ea
commit
9ee1007ade
2 changed files with 23 additions and 11 deletions
|
@ -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 {
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Add table
Reference in a new issue