mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-08-21 10:51:24 +00:00
Chunk: change tile storage hash function to unbind Y coordinate
this isn't strictly needed but it is more scalable in the case of future build height limit lifts.
This commit is contained in:
parent
7c41bfcdf3
commit
848bce193c
@ -594,7 +594,7 @@ class Chunk{
|
|||||||
throw new \InvalidArgumentException("Attempted to add a garbage closed Tile to a chunk");
|
throw new \InvalidArgumentException("Attempted to add a garbage closed Tile to a chunk");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isset($this->tiles[$index = (($tile->x & 0x0f) << 12) | (($tile->z & 0x0f) << 8) | ($tile->y & 0xff)]) and $this->tiles[$index] !== $tile){
|
if(isset($this->tiles[$index = Chunk::blockHash($tile->x, $tile->y, $tile->z)]) and $this->tiles[$index] !== $tile){
|
||||||
$this->tiles[$index]->close();
|
$this->tiles[$index]->close();
|
||||||
}
|
}
|
||||||
$this->tiles[$index] = $tile;
|
$this->tiles[$index] = $tile;
|
||||||
@ -607,7 +607,7 @@ class Chunk{
|
|||||||
* @param Tile $tile
|
* @param Tile $tile
|
||||||
*/
|
*/
|
||||||
public function removeTile(Tile $tile){
|
public function removeTile(Tile $tile){
|
||||||
unset($this->tiles[(($tile->x & 0x0f) << 12) | (($tile->z & 0x0f) << 8) | ($tile->y & 0xff)]);
|
unset($this->tiles[Chunk::blockHash($tile->x, $tile->y, $tile->z)]);
|
||||||
if($this->isInit){
|
if($this->isInit){
|
||||||
$this->hasChanged = true;
|
$this->hasChanged = true;
|
||||||
}
|
}
|
||||||
@ -646,8 +646,7 @@ class Chunk{
|
|||||||
* @return Tile|null
|
* @return Tile|null
|
||||||
*/
|
*/
|
||||||
public function getTile(int $x, int $y, int $z){
|
public function getTile(int $x, int $y, int $z){
|
||||||
$index = ($x << 12) | ($z << 8) | $y;
|
return $this->tiles[Chunk::blockHash($x, $y, $z)] ?? null;
|
||||||
return $this->tiles[$index] ?? null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -922,4 +921,17 @@ class Chunk{
|
|||||||
$chunk->terrainGenerated = (bool) ($flags & 1);
|
$chunk->terrainGenerated = (bool) ($flags & 1);
|
||||||
return $chunk;
|
return $chunk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hashes the given chunk block coordinates into a single integer.
|
||||||
|
*
|
||||||
|
* @param int $x 0-15
|
||||||
|
* @param int $y
|
||||||
|
* @param int $z 0-15
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public static function blockHash(int $x, int $y, int $z) : int{
|
||||||
|
return ($y << 8) | (($z & 0x0f) << 4) | ($x & 0x0f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user