Some refactoring to allow for light updates to be executed asynchronously

This commit is contained in:
Dylan K. Taylor 2017-06-04 17:49:16 +01:00
parent 0cf3914f5d
commit 8919d4a372
6 changed files with 83 additions and 14 deletions

View File

@ -68,6 +68,48 @@ interface ChunkManager{
*/ */
public function setBlockDataAt(int $x, int $y, int $z, int $data); public function setBlockDataAt(int $x, int $y, int $z, int $data);
/**
* Returns the raw block light level
*
* @param int $x
* @param int $y
* @param int $z
*
* @return int
*/
public function getBlockLightAt(int $x, int $y, int $z) : int;
/**
* Sets the raw block light level
*
* @param int $x
* @param int $y
* @param int $z
* @param int $level
*/
public function setBlockLightAt(int $x, int $y, int $z, int $level);
/**
* Returns the highest amount of sky light can reach the specified coordinates.
*
* @param int $x
* @param int $y
* @param int $z
*
* @return int
*/
public function getBlockSkyLightAt(int $x, int $y, int $z) : int;
/**
* Sets the raw block sky light level.
*
* @param int $x
* @param int $y
* @param int $z
* @param int $level
*/
public function setBlockSkyLightAt(int $x, int $y, int $z, int $level);
/** /**
* @param int $chunkX * @param int $chunkX
* @param int $chunkZ * @param int $chunkZ

View File

@ -74,6 +74,8 @@ use pocketmine\level\generator\GeneratorRegisterTask;
use pocketmine\level\generator\GeneratorUnregisterTask; use pocketmine\level\generator\GeneratorUnregisterTask;
use pocketmine\level\generator\LightPopulationTask; use pocketmine\level\generator\LightPopulationTask;
use pocketmine\level\generator\PopulationTask; use pocketmine\level\generator\PopulationTask;
use pocketmine\level\light\BlockLightUpdate;
use pocketmine\level\light\SkyLightUpdate;
use pocketmine\level\particle\DestroyBlockParticle; use pocketmine\level\particle\DestroyBlockParticle;
use pocketmine\level\particle\Particle; use pocketmine\level\particle\Particle;
use pocketmine\level\sound\Sound; use pocketmine\level\sound\Sound;
@ -92,7 +94,6 @@ use pocketmine\nbt\tag\ShortTag;
use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\StringTag;
use pocketmine\network\mcpe\protocol\BatchPacket; use pocketmine\network\mcpe\protocol\BatchPacket;
use pocketmine\network\mcpe\protocol\DataPacket; use pocketmine\network\mcpe\protocol\DataPacket;
use pocketmine\network\mcpe\protocol\FullChunkDataPacket;
use pocketmine\network\mcpe\protocol\LevelEventPacket; use pocketmine\network\mcpe\protocol\LevelEventPacket;
use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket;
use pocketmine\network\mcpe\protocol\MoveEntityPacket; use pocketmine\network\mcpe\protocol\MoveEntityPacket;
@ -104,7 +105,6 @@ use pocketmine\plugin\Plugin;
use pocketmine\Server; use pocketmine\Server;
use pocketmine\tile\Chest; use pocketmine\tile\Chest;
use pocketmine\tile\Tile; use pocketmine\tile\Tile;
use pocketmine\utils\Binary;
use pocketmine\utils\Random; use pocketmine\utils\Random;
use pocketmine\utils\ReversePriorityQueue; use pocketmine\utils\ReversePriorityQueue;

View File

@ -47,7 +47,7 @@ class SimpleChunkManager implements ChunkManager{
*/ */
public function getBlockIdAt(int $x, int $y, int $z) : int{ public function getBlockIdAt(int $x, int $y, int $z) : int{
if($chunk = $this->getChunk($x >> 4, $z >> 4)){ if($chunk = $this->getChunk($x >> 4, $z >> 4)){
return $chunk->getBlockId($x & 0xf, $y & Level::Y_MASK, $z & 0xf); return $chunk->getBlockId($x & 0xf, $y, $z & 0xf);
} }
return 0; return 0;
} }
@ -62,7 +62,7 @@ class SimpleChunkManager implements ChunkManager{
*/ */
public function setBlockIdAt(int $x, int $y, int $z, int $id){ public function setBlockIdAt(int $x, int $y, int $z, int $id){
if($chunk = $this->getChunk($x >> 4, $z >> 4)){ if($chunk = $this->getChunk($x >> 4, $z >> 4)){
$chunk->setBlockId($x & 0xf, $y & Level::Y_MASK, $z & 0xf, $id); $chunk->setBlockId($x & 0xf, $y, $z & 0xf, $id);
} }
} }
@ -77,7 +77,7 @@ class SimpleChunkManager implements ChunkManager{
*/ */
public function getBlockDataAt(int $x, int $y, int $z) : int{ public function getBlockDataAt(int $x, int $y, int $z) : int{
if($chunk = $this->getChunk($x >> 4, $z >> 4)){ if($chunk = $this->getChunk($x >> 4, $z >> 4)){
return $chunk->getBlockData($x & 0xf, $y & Level::Y_MASK, $z & 0xf); return $chunk->getBlockData($x & 0xf, $y, $z & 0xf);
} }
return 0; return 0;
} }
@ -92,7 +92,35 @@ class SimpleChunkManager implements ChunkManager{
*/ */
public function setBlockDataAt(int $x, int $y, int $z, int $data){ public function setBlockDataAt(int $x, int $y, int $z, int $data){
if($chunk = $this->getChunk($x >> 4, $z >> 4)){ if($chunk = $this->getChunk($x >> 4, $z >> 4)){
$chunk->setBlockData($x & 0xf, $y & Level::Y_MASK, $z & 0xf, $data); $chunk->setBlockData($x & 0xf, $y, $z & 0xf, $data);
}
}
public function getBlockLightAt(int $x, int $y, int $z) : int{
if($chunk = $this->getChunk($x >> 4, $z >> 4)){
return $chunk->getBlockLight($x & 0xf, $y, $z & 0xf);
}
return 0;
}
public function setBlockLightAt(int $x, int $y, int $z, int $level){
if($chunk = $this->getChunk($x >> 4, $z >> 4)){
$chunk->setBlockLight($x & 0xf, $y, $z & 0xf, $level);
}
}
public function getBlockSkyLightAt(int $x, int $y, int $z) : int{
if($chunk = $this->getChunk($x >> 4, $z >> 4)){
return $chunk->getBlockSkyLight($x & 0xf, $y, $z & 0xf);
}
return 0;
}
public function setBlockSkyLightAt(int $x, int $y, int $z, int $level){
if($chunk = $this->getChunk($x >> 4, $z >> 4)){
$chunk->setBlockSkyLight($x & 0xf, $y, $z & 0xf, $level);
} }
} }

View File

@ -21,8 +21,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace pocketmine\level; namespace pocketmine\level\light;
class BlockLightUpdate extends LightUpdate{ class BlockLightUpdate extends LightUpdate{

View File

@ -21,15 +21,16 @@
declare(strict_types=1); declare(strict_types=1);
namespace pocketmine\level; namespace pocketmine\level\light;
use pocketmine\block\Block; use pocketmine\block\Block;
use pocketmine\level\ChunkManager;
use pocketmine\level\Level;
//TODO: make light updates asynchronous //TODO: make light updates asynchronous
abstract class LightUpdate{ abstract class LightUpdate{
/** @var Level */ /** @var ChunkManager */
protected $level; protected $level;
/** @var \SplQueue */ /** @var \SplQueue */
@ -42,7 +43,7 @@ abstract class LightUpdate{
/** @var bool[] */ /** @var bool[] */
protected $removalVisited = []; protected $removalVisited = [];
public function __construct(Level $level){ public function __construct(ChunkManager $level){
$this->level = $level; $this->level = $level;
$this->removalQueue = new \SplQueue(); $this->removalQueue = new \SplQueue();
$this->spreadQueue = new \SplQueue(); $this->spreadQueue = new \SplQueue();

View File

@ -21,8 +21,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace pocketmine\level; namespace pocketmine\level\light;
class SkyLightUpdate extends LightUpdate{ class SkyLightUpdate extends LightUpdate{