SubChunk: remove BlockLegacyIds dependency, allow parameterising default block

This commit is contained in:
Dylan K. Taylor 2019-07-08 15:01:11 +01:00
parent 4e2f430f06
commit 007aee72f8
7 changed files with 23 additions and 16 deletions

View File

@ -644,7 +644,7 @@ class Chunk{
if($y < 0 or $y >= $this->height){ if($y < 0 or $y >= $this->height){
return $this->emptySubChunk; return $this->emptySubChunk;
}elseif($generateNew and $this->subChunks[$y] instanceof EmptySubChunk){ }elseif($generateNew and $this->subChunks[$y] instanceof EmptySubChunk){
$this->subChunks[$y] = new SubChunk([new PalettedBlockArray(BlockLegacyIds::AIR << 4)]); $this->subChunks[$y] = new SubChunk(BlockLegacyIds::AIR << 4, []);
} }
return $this->subChunks[$y]; return $this->subChunks[$y];

View File

@ -23,10 +23,11 @@ declare(strict_types=1);
namespace pocketmine\world\format; namespace pocketmine\world\format;
use pocketmine\block\BlockLegacyIds;
use function array_values; use function array_values;
class SubChunk implements SubChunkInterface{ class SubChunk implements SubChunkInterface{
/** @var int */
private $defaultBlock;
/** @var PalettedBlockArray[] */ /** @var PalettedBlockArray[] */
private $blockLayers; private $blockLayers;
@ -38,11 +39,13 @@ class SubChunk implements SubChunkInterface{
/** /**
* SubChunk constructor. * SubChunk constructor.
* *
* @param int $default
* @param PalettedBlockArray[] $blocks * @param PalettedBlockArray[] $blocks
* @param LightArray|null $skyLight * @param LightArray|null $skyLight
* @param LightArray|null $blockLight * @param LightArray|null $blockLight
*/ */
public function __construct(array $blocks, ?LightArray $skyLight = null, ?LightArray $blockLight = null){ public function __construct(int $default, array $blocks, ?LightArray $skyLight = null, ?LightArray $blockLight = null){
$this->defaultBlock = $default;
$this->blockLayers = $blocks; $this->blockLayers = $blocks;
$this->skyLight = $skyLight ?? new LightArray(LightArray::FIFTEEN); $this->skyLight = $skyLight ?? new LightArray(LightArray::FIFTEEN);
@ -53,7 +56,7 @@ class SubChunk implements SubChunkInterface{
foreach($this->blockLayers as $layer){ foreach($this->blockLayers as $layer){
$palette = $layer->getPalette(); $palette = $layer->getPalette();
foreach($palette as $p){ foreach($palette as $p){
if($p !== (BlockLegacyIds::AIR << 4)){ if($p !== $this->defaultBlock){
return false; return false;
} }
} }
@ -68,14 +71,14 @@ class SubChunk implements SubChunkInterface{
public function getFullBlock(int $x, int $y, int $z) : int{ public function getFullBlock(int $x, int $y, int $z) : int{
if(empty($this->blockLayers)){ if(empty($this->blockLayers)){
return BlockLegacyIds::AIR << 4; return $this->defaultBlock;
} }
return $this->blockLayers[0]->get($x, $y, $z); return $this->blockLayers[0]->get($x, $y, $z);
} }
public function setFullBlock(int $x, int $y, int $z, int $block) : void{ public function setFullBlock(int $x, int $y, int $z, int $block) : void{
if(empty($this->blockLayers)){ if(empty($this->blockLayers)){
$this->blockLayers[] = new PalettedBlockArray(BlockLegacyIds::AIR << 4); $this->blockLayers[] = new PalettedBlockArray($this->defaultBlock);
} }
$this->blockLayers[0]->set($x, $y, $z, $block); $this->blockLayers[0]->set($x, $y, $z, $block);
} }
@ -112,7 +115,7 @@ class SubChunk implements SubChunkInterface{
return -1; return -1;
} }
for($y = 15; $y >= 0; --$y){ for($y = 15; $y >= 0; --$y){
if($this->blockLayers[0]->get($x, $y, $z) !== (BlockLegacyIds::AIR << 4)){ if($this->blockLayers[0]->get($x, $y, $z) !== $this->defaultBlock){
return $y; return $y;
} }
} }
@ -145,7 +148,7 @@ class SubChunk implements SubChunkInterface{
$layer->collectGarbage(); $layer->collectGarbage();
foreach($layer->getPalette() as $p){ foreach($layer->getPalette() as $p){
if($p !== (BlockLegacyIds::AIR << 4)){ if($p !== $this->defaultBlock){
continue 2; continue 2;
} }
} }

View File

@ -23,6 +23,7 @@ declare(strict_types=1);
namespace pocketmine\world\format\io; namespace pocketmine\world\format\io;
use pocketmine\block\BlockLegacyIds;
use pocketmine\utils\BinaryStream; use pocketmine\utils\BinaryStream;
use pocketmine\world\format\Chunk; use pocketmine\world\format\Chunk;
use pocketmine\world\format\EmptySubChunk; use pocketmine\world\format\EmptySubChunk;
@ -135,7 +136,7 @@ final class FastChunkSerializer{
$layers[] = PalettedBlockArray::fromData($bitsPerBlock, $words, $palette); $layers[] = PalettedBlockArray::fromData($bitsPerBlock, $words, $palette);
} }
$subChunks[$y] = new SubChunk( $subChunks[$y] = new SubChunk(
$layers, $lightPopulated ? new LightArray($stream->get(2048)) : null, $lightPopulated ? new LightArray($stream->get(2048)) : null BlockLegacyIds::AIR << 4, $layers, $lightPopulated ? new LightArray($stream->get(2048)) : null, $lightPopulated ? new LightArray($stream->get(2048)) : null
); );
} }

View File

@ -303,14 +303,14 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{
$storages[] = $convertedLegacyExtraData[$y]; $storages[] = $convertedLegacyExtraData[$y];
} }
$subChunks[$y] = new SubChunk($storages); $subChunks[$y] = new SubChunk(BlockLegacyIds::AIR << 4, $storages);
break; break;
case 1: //paletted v1, has a single blockstorage case 1: //paletted v1, has a single blockstorage
$storages = [$this->deserializePaletted($binaryStream)]; $storages = [$this->deserializePaletted($binaryStream)];
if(isset($convertedLegacyExtraData[$y])){ if(isset($convertedLegacyExtraData[$y])){
$storages[] = $convertedLegacyExtraData[$y]; $storages[] = $convertedLegacyExtraData[$y];
} }
$subChunks[$y] = new SubChunk($storages); $subChunks[$y] = new SubChunk(BlockLegacyIds::AIR << 4, $storages);
break; break;
case 8: case 8:
//legacy extradata layers intentionally ignored because they aren't supposed to exist in v8 //legacy extradata layers intentionally ignored because they aren't supposed to exist in v8
@ -321,7 +321,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{
for($k = 0; $k < $storageCount; ++$k){ for($k = 0; $k < $storageCount; ++$k){
$storages[] = $this->deserializePaletted($binaryStream); $storages[] = $this->deserializePaletted($binaryStream);
} }
$subChunks[$y] = new SubChunk($storages); $subChunks[$y] = new SubChunk(BlockLegacyIds::AIR << 4, $storages);
} }
break; break;
default: default:
@ -365,7 +365,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{
if(isset($convertedLegacyExtraData[$yy])){ if(isset($convertedLegacyExtraData[$yy])){
$storages[] = $convertedLegacyExtraData[$yy]; $storages[] = $convertedLegacyExtraData[$yy];
} }
$subChunks[$yy] = new SubChunk($storages); $subChunks[$yy] = new SubChunk(BlockLegacyIds::AIR << 4, $storages);
} }
try{ try{

View File

@ -23,6 +23,7 @@ declare(strict_types=1);
namespace pocketmine\world\format\io\region; namespace pocketmine\world\format\io\region;
use pocketmine\block\BlockLegacyIds;
use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\CompoundTag;
use pocketmine\world\format\io\SubChunkConverter; use pocketmine\world\format\io\SubChunkConverter;
use pocketmine\world\format\SubChunk; use pocketmine\world\format\SubChunk;
@ -35,7 +36,7 @@ class Anvil extends RegionWorldProvider{
} }
protected function deserializeSubChunk(CompoundTag $subChunk) : SubChunk{ protected function deserializeSubChunk(CompoundTag $subChunk) : SubChunk{
return new SubChunk([SubChunkConverter::convertSubChunkYZX($subChunk->getByteArray("Blocks"), $subChunk->getByteArray("Data"))]); return new SubChunk(BlockLegacyIds::AIR << 4, [SubChunkConverter::convertSubChunkYZX($subChunk->getByteArray("Blocks"), $subChunk->getByteArray("Data"))]);
//ignore legacy light information //ignore legacy light information
} }

View File

@ -23,6 +23,7 @@ declare(strict_types=1);
namespace pocketmine\world\format\io\region; namespace pocketmine\world\format\io\region;
use pocketmine\block\BlockLegacyIds;
use pocketmine\nbt\BigEndianNbtSerializer; use pocketmine\nbt\BigEndianNbtSerializer;
use pocketmine\nbt\NbtDataException; use pocketmine\nbt\NbtDataException;
use pocketmine\nbt\tag\ByteArrayTag; use pocketmine\nbt\tag\ByteArrayTag;
@ -71,7 +72,7 @@ class McRegion extends RegionWorldProvider{
$fullData = $chunk->hasTag("Data", ByteArrayTag::class) ? $chunk->getByteArray("Data") : str_repeat("\x00", 16384); $fullData = $chunk->hasTag("Data", ByteArrayTag::class) ? $chunk->getByteArray("Data") : str_repeat("\x00", 16384);
for($y = 0; $y < 8; ++$y){ for($y = 0; $y < 8; ++$y){
$subChunks[$y] = new SubChunk([SubChunkConverter::convertSubChunkFromLegacyColumn($fullIds, $fullData, $y)]); $subChunks[$y] = new SubChunk(BlockLegacyIds::AIR << 4, [SubChunkConverter::convertSubChunkFromLegacyColumn($fullIds, $fullData, $y)]);
} }
if($chunk->hasTag("BiomeColors", IntArrayTag::class)){ if($chunk->hasTag("BiomeColors", IntArrayTag::class)){

View File

@ -23,6 +23,7 @@ declare(strict_types=1);
namespace pocketmine\world\format\io\region; namespace pocketmine\world\format\io\region;
use pocketmine\block\BlockLegacyIds;
use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\CompoundTag;
use pocketmine\world\format\io\SubChunkConverter; use pocketmine\world\format\io\SubChunkConverter;
use pocketmine\world\format\SubChunk; use pocketmine\world\format\SubChunk;
@ -35,7 +36,7 @@ class PMAnvil extends RegionWorldProvider{
use LegacyAnvilChunkTrait; use LegacyAnvilChunkTrait;
protected function deserializeSubChunk(CompoundTag $subChunk) : SubChunk{ protected function deserializeSubChunk(CompoundTag $subChunk) : SubChunk{
return new SubChunk([SubChunkConverter::convertSubChunkXZY($subChunk->getByteArray("Blocks"), $subChunk->getByteArray("Data"))]); return new SubChunk(BlockLegacyIds::AIR << 4, [SubChunkConverter::convertSubChunkXZY($subChunk->getByteArray("Blocks"), $subChunk->getByteArray("Data"))]);
} }
protected static function getRegionFileExtension() : string{ protected static function getRegionFileExtension() : string{