mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-30 15:19:56 +00:00
FastChunkSerializer: retain emptyBlock on subchunks
I think we should probably get rid of this considering the potential for inconsistencies within a chunk, but not retaining this is a bug nonetheless, even though it doesn't have any effect in PM itself since we always use BlockLegacyIds << 4 as the empty block ID. so, this is only really aiding (ab)use cases which weren't intended anyway ...
This commit is contained in:
parent
4e94025b3b
commit
0a7d81a2b0
@ -69,6 +69,12 @@ class SubChunk{
|
|||||||
return count($this->blockLayers) === 0;
|
return count($this->blockLayers) === 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the block used as the default. This is assumed to refer to air.
|
||||||
|
* If all the blocks in a subchunk layer are equal to this block, the layer is assumed to be empty.
|
||||||
|
*/
|
||||||
|
public function getEmptyBlockId() : int{ return $this->emptyBlockId; }
|
||||||
|
|
||||||
public function getFullBlock(int $x, int $y, int $z) : int{
|
public function getFullBlock(int $x, int $y, int $z) : int{
|
||||||
if(count($this->blockLayers) === 0){
|
if(count($this->blockLayers) === 0){
|
||||||
return $this->emptyBlockId;
|
return $this->emptyBlockId;
|
||||||
|
@ -23,7 +23,6 @@ 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\BiomeArray;
|
use pocketmine\world\format\BiomeArray;
|
||||||
use pocketmine\world\format\Chunk;
|
use pocketmine\world\format\Chunk;
|
||||||
@ -77,6 +76,7 @@ final class FastChunkSerializer{
|
|||||||
|
|
||||||
foreach($subChunks as $y => $subChunk){
|
foreach($subChunks as $y => $subChunk){
|
||||||
$stream->putByte($y);
|
$stream->putByte($y);
|
||||||
|
$stream->putInt($subChunk->getEmptyBlockId());
|
||||||
$layers = $subChunk->getBlockLayers();
|
$layers = $subChunk->getBlockLayers();
|
||||||
$stream->putByte(count($layers));
|
$stream->putByte(count($layers));
|
||||||
foreach($layers as $blocks){
|
foreach($layers as $blocks){
|
||||||
@ -126,6 +126,7 @@ final class FastChunkSerializer{
|
|||||||
$count = $stream->getByte();
|
$count = $stream->getByte();
|
||||||
for($subCount = 0; $subCount < $count; ++$subCount){
|
for($subCount = 0; $subCount < $count; ++$subCount){
|
||||||
$y = $stream->getByte();
|
$y = $stream->getByte();
|
||||||
|
$airBlockId = $stream->getInt();
|
||||||
|
|
||||||
/** @var PalettedBlockArray[] $layers */
|
/** @var PalettedBlockArray[] $layers */
|
||||||
$layers = [];
|
$layers = [];
|
||||||
@ -137,7 +138,7 @@ final class FastChunkSerializer{
|
|||||||
$layers[] = PalettedBlockArray::fromData($bitsPerBlock, $words, $palette);
|
$layers[] = PalettedBlockArray::fromData($bitsPerBlock, $words, $palette);
|
||||||
}
|
}
|
||||||
$subChunks[$y] = new SubChunk(
|
$subChunks[$y] = new SubChunk(
|
||||||
BlockLegacyIds::AIR << 4, $layers, $lightPopulated ? new LightArray($stream->get(2048)) : null, $lightPopulated ? new LightArray($stream->get(2048)) : null
|
$airBlockId, $layers, $lightPopulated ? new LightArray($stream->get(2048)) : null, $lightPopulated ? new LightArray($stream->get(2048)) : null
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user