Chunk: add getNBTentities() and getNBTtiles()

this shit is horrible, but it's needed for now...
This commit is contained in:
Dylan K. Taylor 2019-03-03 14:00:46 +00:00
parent 93cd00ae8f
commit 6e00ab2069
4 changed files with 21 additions and 41 deletions

View File

@ -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
*

View File

@ -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);

View File

@ -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

View File

@ -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);