diff --git a/src/pocketmine/level/format/Chunk.php b/src/pocketmine/level/format/Chunk.php index 948516e945..f8796afb80 100644 --- a/src/pocketmine/level/format/Chunk.php +++ b/src/pocketmine/level/format/Chunk.php @@ -38,6 +38,7 @@ use pocketmine\tile\TileFactory; use pocketmine\utils\BinaryStream; use function array_fill; use function array_filter; +use function array_map; use function array_values; use function assert; use function chr; @@ -590,6 +591,20 @@ class Chunk{ } } + /** + * @return CompoundTag[] + */ + public function getNBTtiles() : array{ + return $this->NBTtiles ?? array_map(function(Tile $tile) : CompoundTag{ return $tile->saveNBT(); }, $this->tiles); + } + + /** + * @return CompoundTag[] + */ + public function getNBTentities() : array{ + return $this->NBTentities ?? array_map(function(Entity $entity) : CompoundTag{ return $entity->saveNBT(); }, $this->getSavableEntities()); + } + /** * Deserializes tiles and entities from NBT * diff --git a/src/pocketmine/level/format/io/leveldb/LevelDB.php b/src/pocketmine/level/format/io/leveldb/LevelDB.php index 069692c7cf..cd91e59fc4 100644 --- a/src/pocketmine/level/format/io/leveldb/LevelDB.php +++ b/src/pocketmine/level/format/io/leveldb/LevelDB.php @@ -343,19 +343,8 @@ class LevelDB extends BaseLevelProvider{ //TODO: use this properly $this->db->put($index . self::TAG_STATE_FINALISATION, chr(self::FINALISATION_DONE)); - /** @var CompoundTag[] $tiles */ - $tiles = []; - foreach($chunk->getTiles() as $tile){ - $tiles[] = $tile->saveNBT(); - } - $this->writeTags($tiles, $index . self::TAG_BLOCK_ENTITY); - - /** @var CompoundTag[] $entities */ - $entities = []; - foreach($chunk->getSavableEntities() as $entity){ - $entities[] = $entity->saveNBT(); - } - $this->writeTags($entities, $index . self::TAG_ENTITY); + $this->writeTags($chunk->getNBTtiles(), $index . self::TAG_BLOCK_ENTITY); + $this->writeTags($chunk->getNBTentities(), $index . self::TAG_ENTITY); $this->db->delete($index . self::TAG_DATA_2D_LEGACY); $this->db->delete($index . self::TAG_LEGACY_TERRAIN); diff --git a/src/pocketmine/level/format/io/region/LegacyAnvilChunkTrait.php b/src/pocketmine/level/format/io/region/LegacyAnvilChunkTrait.php index 3d68f5f6c2..e10e6eb287 100644 --- a/src/pocketmine/level/format/io/region/LegacyAnvilChunkTrait.php +++ b/src/pocketmine/level/format/io/region/LegacyAnvilChunkTrait.php @@ -73,20 +73,8 @@ trait LegacyAnvilChunkTrait{ $nbt->setByteArray("Biomes", $chunk->getBiomeIdArray()); $nbt->setIntArray("HeightMap", $chunk->getHeightMapArray()); - $entities = []; - - foreach($chunk->getSavableEntities() as $entity){ - $entities[] = $entity->saveNBT(); - } - - $nbt->setTag(new ListTag("Entities", $entities, NBT::TAG_Compound)); - - $tiles = []; - foreach($chunk->getTiles() as $tile){ - $tiles[] = $tile->saveNBT(); - } - - $nbt->setTag(new ListTag("TileEntities", $tiles, NBT::TAG_Compound)); + $nbt->setTag(new ListTag("Entities", $chunk->getNBTentities(), NBT::TAG_Compound)); + $nbt->setTag(new ListTag("TileEntities", $chunk->getNBTtiles(), NBT::TAG_Compound)); //TODO: TileTicks diff --git a/src/pocketmine/level/format/io/region/McRegion.php b/src/pocketmine/level/format/io/region/McRegion.php index 277e6ff893..b4047ce96d 100644 --- a/src/pocketmine/level/format/io/region/McRegion.php +++ b/src/pocketmine/level/format/io/region/McRegion.php @@ -81,20 +81,8 @@ class McRegion extends RegionLevelProvider{ $nbt->setByteArray("Biomes", $chunk->getBiomeIdArray()); //doesn't exist in regular McRegion, this is here for PocketMine-MP only $nbt->setByteArray("HeightMap", pack("C*", ...$chunk->getHeightMapArray())); //this is ByteArray in McRegion, but IntArray in Anvil (due to raised build height) - $entities = []; - - foreach($chunk->getSavableEntities() as $entity){ - $entities[] = $entity->saveNBT(); - } - - $nbt->setTag(new ListTag("Entities", $entities, NBT::TAG_Compound)); - - $tiles = []; - foreach($chunk->getTiles() as $tile){ - $tiles[] = $tile->saveNBT(); - } - - $nbt->setTag(new ListTag("TileEntities", $tiles, NBT::TAG_Compound)); + $nbt->setTag(new ListTag("Entities", $chunk->getNBTentities(), NBT::TAG_Compound)); + $nbt->setTag(new ListTag("TileEntities", $chunk->getNBTtiles(), NBT::TAG_Compound)); $writer = new BigEndianNbtSerializer(); return $writer->writeCompressed(new CompoundTag("", [$nbt]), ZLIB_ENCODING_DEFLATE, RegionLoader::$COMPRESSION_LEVEL);