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 biomesIntArray = level->get<NBT::IntArrayTag>("Biomes");
|
||||||
auto biomesByteArray = level->get<NBT::ByteArrayTag>("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);
|
biomeInts = std::move(biomesIntArray);
|
||||||
else if (biomesIntArray && biomesIntArray->getLength() == SIZE*SIZE)
|
biomeFormat = INT_ARRAY;
|
||||||
biomeIntsPre115 = std::move(biomesIntArray);
|
} else if (biomesIntArray && biomesIntArray->getLength() == SIZE*SIZE) {
|
||||||
else if (biomesByteArray && biomesByteArray->getLength() == SIZE*SIZE)
|
biomeInts = std::move(biomesIntArray);
|
||||||
|
biomeFormat = INT_ARRAY_PRE1_15;
|
||||||
|
} else if (biomesByteArray && biomesByteArray->getLength() == SIZE*SIZE) {
|
||||||
biomeBytes = std::move(biomesByteArray);
|
biomeBytes = std::move(biomesByteArray);
|
||||||
else
|
biomeFormat = BYTE_ARRAY;
|
||||||
|
} else {
|
||||||
throw std::invalid_argument("corrupt biome data");
|
throw std::invalid_argument("corrupt biome data");
|
||||||
|
}
|
||||||
|
|
||||||
auto dataVersionTag = data->getRoot()->get<NBT::IntTag>("DataVersion");
|
auto dataVersionTag = data->getRoot()->get<NBT::IntTag>("DataVersion");
|
||||||
uint32_t dataVersion = dataVersionTag ? dataVersionTag->getValue() : 0;
|
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)
|
if (x > SIZE || y > MAXY || z > SIZE)
|
||||||
throw std::invalid_argument("corrupt chunk data");
|
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));
|
return biomeInts->getValue((y>>BSHIFT)*BSIZE*BSIZE + (z>>BSHIFT)*BSIZE + (x>>BSHIFT));
|
||||||
else if (biomeIntsPre115)
|
case INT_ARRAY_PRE1_15:
|
||||||
return biomeIntsPre115->getValue(z*SIZE + x);
|
return biomeInts->getValue(z*SIZE + x);
|
||||||
else if (biomeBytes)
|
case BYTE_ARRAY:
|
||||||
return biomeBytes->getValue(z*SIZE + x);
|
return biomeBytes->getValue(z*SIZE + x);
|
||||||
else
|
default:
|
||||||
return 0xff;
|
return 0xff;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Block Chunk::getBlock(block_idx_t x, Chunk::Height height, block_idx_t z) const {
|
Block Chunk::getBlock(block_idx_t x, Chunk::Height height, block_idx_t z) const {
|
||||||
|
|
|
@ -57,8 +57,14 @@ public:
|
||||||
private:
|
private:
|
||||||
std::vector<std::unique_ptr<Section>> sections;
|
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::ByteArrayTag> biomeBytes;
|
||||||
std::shared_ptr<const NBT::IntArrayTag> biomeIntsPre115;
|
|
||||||
std::shared_ptr<const NBT::IntArrayTag> biomeInts;
|
std::shared_ptr<const NBT::IntArrayTag> biomeInts;
|
||||||
|
|
||||||
bool getHeight(
|
bool getHeight(
|
||||||
|
|
Loading…
Add table
Reference in a new issue