diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index 5a8c06fa5..cc94c95f1 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -69,7 +69,7 @@ class ChunkRequestTask extends AsyncTask{ public function onRun() : void{ $chunk = FastChunkSerializer::deserializeTerrain($this->chunk); - $subCount = ChunkSerializer::getSubChunkCount($chunk) + ChunkSerializer::LOWER_PADDING_SIZE; + $subCount = ChunkSerializer::getSubChunkCount($chunk); $encoderContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); $payload = ChunkSerializer::serializeFullChunk($chunk, RuntimeBlockMapping::getInstance(), $encoderContext, $this->tiles); $this->setResult($this->compressor->compress(PacketBatch::fromPackets($encoderContext, LevelChunkPacket::create($this->chunkX, $this->chunkZ, $subCount, false, null, $payload))->getBuffer())); diff --git a/src/network/mcpe/serializer/ChunkSerializer.php b/src/network/mcpe/serializer/ChunkSerializer.php index f83e2fa20..6246dcc49 100644 --- a/src/network/mcpe/serializer/ChunkSerializer.php +++ b/src/network/mcpe/serializer/ChunkSerializer.php @@ -41,8 +41,6 @@ use function count; use function str_repeat; final class ChunkSerializer{ - public const LOWER_PADDING_SIZE = 4; - private function __construct(){ //NOOP } @@ -65,12 +63,6 @@ final class ChunkSerializer{ public static function serializeFullChunk(Chunk $chunk, RuntimeBlockMapping $blockMapper, PacketSerializerContext $encoderContext, ?string $tiles = null) : string{ $stream = PacketSerializer::encoder($encoderContext); - //TODO: HACK! fill in fake subchunks to make up for the new negative space client-side - for($y = 0; $y < self::LOWER_PADDING_SIZE; $y++){ - $stream->putByte(8); //subchunk version 8 - $stream->putByte(0); //0 layers - client will treat this as all-air - } - $subChunkCount = self::getSubChunkCount($chunk); for($y = Chunk::MIN_SUBCHUNK_INDEX, $writtenCount = 0; $writtenCount < $subChunkCount; ++$y, ++$writtenCount){ self::serializeSubChunk($chunk->getSubChunk($y), $blockMapper, $stream, false); diff --git a/src/world/World.php b/src/world/World.php index 6c2a6a9e5..4aa5ba7dc 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -134,8 +134,8 @@ class World implements ChunkManager{ /** @var int */ private static $worldIdCounter = 1; - public const Y_MAX = 256; - public const Y_MIN = 0; + public const Y_MAX = 320; + public const Y_MIN = -64; public const TIME_DAY = 1000; public const TIME_NOON = 6000; diff --git a/src/world/format/Chunk.php b/src/world/format/Chunk.php index 6a8dad59c..6e33e0c05 100644 --- a/src/world/format/Chunk.php +++ b/src/world/format/Chunk.php @@ -35,8 +35,8 @@ class Chunk{ public const DIRTY_FLAG_BLOCKS = 1 << 0; public const DIRTY_FLAG_BIOMES = 1 << 3; - public const MIN_SUBCHUNK_INDEX = 0; - public const MAX_SUBCHUNK_INDEX = 15; + public const MIN_SUBCHUNK_INDEX = -4; + public const MAX_SUBCHUNK_INDEX = 19; public const MAX_SUBCHUNKS = self::MAX_SUBCHUNK_INDEX - self::MIN_SUBCHUNK_INDEX + 1; public const EDGE_LENGTH = SubChunk::EDGE_LENGTH; diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index e3b8eeef4..6bf9552f4 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -123,11 +123,11 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ } public function getWorldMinY() : int{ - return 0; + return -64; } public function getWorldMaxY() : int{ - return 256; + return 320; } public static function isValid(string $path) : bool{ @@ -514,25 +514,6 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $chunk = $chunkData->getChunk(); - //TODO: This ensures that negative subchunks don't get destroyed in newer worlds for as long as we don't yet - //support negative height. Since we don't save with a shift, if the old save had the subchunks shifted, we need - //to shift them to their correct positions to avoid destroying data. - //This can be removed once we support the full height. - if($previousVersion !== null && self::hasOffsetCavesAndCliffsSubChunks($previousVersion)){ - $subChunks = $chunk->getSubChunks(); - - for($y = -4; $y <= 20; $y++){ - $key = $index . ChunkDataKey::SUBCHUNK . chr($y + self::CAVES_CLIFFS_EXPERIMENTAL_SUBCHUNK_KEY_OFFSET); - if( - (!isset($subChunks[$y]) || !$chunk->getTerrainDirtyFlag(Chunk::DIRTY_FLAG_BLOCKS)) && - ($subChunkData = $this->db->get($key)) !== false - ){ - $write->delete($key); - $write->put($index . ChunkDataKey::SUBCHUNK . chr($y & 0xff), $subChunkData); - } - } - } - if($chunk->getTerrainDirtyFlag(Chunk::DIRTY_FLAG_BLOCKS)){ $subChunks = $chunk->getSubChunks();