mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-09-07 18:32:55 +00:00
Stop hardcoding chunk dimensions everywhere (#4443)
This commit is contained in:
@ -39,6 +39,10 @@ class Chunk{
|
||||
|
||||
public const MAX_SUBCHUNKS = 16;
|
||||
|
||||
public const EDGE_LENGTH = SubChunk::EDGE_LENGTH;
|
||||
public const COORD_BIT_SIZE = SubChunk::COORD_BIT_SIZE;
|
||||
public const COORD_MASK = SubChunk::COORD_MASK;
|
||||
|
||||
/** @var int */
|
||||
private $terrainDirtyFlags = 0;
|
||||
|
||||
@ -72,7 +76,7 @@ class Chunk{
|
||||
$this->subChunks[$y] = $subChunks[$y] ?? new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, []);
|
||||
}
|
||||
|
||||
$val = ($this->subChunks->getSize() * 16);
|
||||
$val = ($this->subChunks->getSize() * SubChunk::EDGE_LENGTH);
|
||||
$this->heightMap = $heightMap ?? new HeightArray(array_fill(0, 256, $val));
|
||||
$this->biomeIds = $biomeIds ?? BiomeArray::fill(BiomeIds::OCEAN);
|
||||
}
|
||||
@ -94,14 +98,14 @@ class Chunk{
|
||||
* @return int bitmap, (id << 4) | meta
|
||||
*/
|
||||
public function getFullBlock(int $x, int $y, int $z) : int{
|
||||
return $this->getSubChunk($y >> 4)->getFullBlock($x, $y & 0x0f, $z);
|
||||
return $this->getSubChunk($y >> SubChunk::COORD_BIT_SIZE)->getFullBlock($x, $y & SubChunk::COORD_MASK, $z);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the blockstate at the given coordinate by internal ID.
|
||||
*/
|
||||
public function setFullBlock(int $x, int $y, int $z, int $block) : void{
|
||||
$this->getSubChunk($y >> 4)->setFullBlock($x, $y & 0xf, $z, $block);
|
||||
$this->getSubChunk($y >> SubChunk::COORD_BIT_SIZE)->setFullBlock($x, $y & SubChunk::COORD_MASK, $z, $block);
|
||||
$this->terrainDirtyFlags |= self::DIRTY_FLAG_TERRAIN;
|
||||
}
|
||||
|
||||
@ -117,7 +121,7 @@ class Chunk{
|
||||
for($y = $this->subChunks->count() - 1; $y >= 0; --$y){
|
||||
$height = $this->getSubChunk($y)->getHighestBlockAt($x, $z);
|
||||
if($height !== null){
|
||||
return $height | ($y << 4);
|
||||
return $height | ($y << SubChunk::COORD_BIT_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -328,6 +332,8 @@ class Chunk{
|
||||
* @param int $z 0-15
|
||||
*/
|
||||
public static function blockHash(int $x, int $y, int $z) : int{
|
||||
return ($y << 8) | (($z & 0x0f) << 4) | ($x & 0x0f);
|
||||
return ($y << (2 * SubChunk::COORD_BIT_SIZE)) |
|
||||
(($z & SubChunk::COORD_MASK) << SubChunk::COORD_BIT_SIZE) |
|
||||
($x & SubChunk::COORD_MASK);
|
||||
}
|
||||
}
|
||||
|
@ -28,6 +28,10 @@ use function array_values;
|
||||
use function count;
|
||||
|
||||
class SubChunk{
|
||||
public const COORD_BIT_SIZE = 4;
|
||||
public const COORD_MASK = ~(~0 << self::COORD_BIT_SIZE);
|
||||
public const EDGE_LENGTH = 1 << self::COORD_BIT_SIZE;
|
||||
|
||||
/** @var int */
|
||||
private $emptyBlockId;
|
||||
/** @var PalettedBlockArray[] */
|
||||
@ -100,7 +104,7 @@ class SubChunk{
|
||||
if(count($this->blockLayers) === 0){
|
||||
return null;
|
||||
}
|
||||
for($y = 15; $y >= 0; --$y){
|
||||
for($y = self::EDGE_LENGTH - 1; $y >= 0; --$y){
|
||||
if($this->blockLayers[0]->get($x, $y, $z) !== $this->emptyBlockId){
|
||||
return $y;
|
||||
}
|
||||
|
@ -216,8 +216,8 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{
|
||||
|
||||
self::deserializeExtraDataKey($chunkVersion, $key, $x, $fullY, $z);
|
||||
|
||||
$ySub = ($fullY >> 4) & 0xf;
|
||||
$y = $key & 0xf;
|
||||
$ySub = ($fullY >> SubChunk::COORD_BIT_SIZE);
|
||||
$y = $key & SubChunk::COORD_MASK;
|
||||
|
||||
$blockId = $value & 0xff;
|
||||
$blockData = ($value >> 8) & 0xf;
|
||||
|
Reference in New Issue
Block a user