mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-09-07 02:08:21 +00:00
Cleaned up random-block-ticking registration
This commit is contained in:
@ -26,28 +26,8 @@ declare(strict_types=1);
|
||||
*/
|
||||
namespace pocketmine\level;
|
||||
|
||||
use pocketmine\block\Beetroot;
|
||||
use pocketmine\block\Block;
|
||||
use pocketmine\block\BlockFactory;
|
||||
use pocketmine\block\BrownMushroom;
|
||||
use pocketmine\block\Cactus;
|
||||
use pocketmine\block\Carrot;
|
||||
use pocketmine\block\Farmland;
|
||||
use pocketmine\block\Fire;
|
||||
use pocketmine\block\Grass;
|
||||
use pocketmine\block\Ice;
|
||||
use pocketmine\block\Leaves;
|
||||
use pocketmine\block\Leaves2;
|
||||
use pocketmine\block\MelonStem;
|
||||
use pocketmine\block\Mycelium;
|
||||
use pocketmine\block\NetherWartPlant;
|
||||
use pocketmine\block\Potato;
|
||||
use pocketmine\block\PumpkinStem;
|
||||
use pocketmine\block\RedMushroom;
|
||||
use pocketmine\block\Sapling;
|
||||
use pocketmine\block\SnowLayer;
|
||||
use pocketmine\block\Sugarcane;
|
||||
use pocketmine\block\Wheat;
|
||||
use pocketmine\entity\Arrow;
|
||||
use pocketmine\entity\Effect;
|
||||
use pocketmine\entity\Entity;
|
||||
@ -229,30 +209,8 @@ class Level implements ChunkManager, Metadatable{
|
||||
private $chunkTickList = [];
|
||||
private $chunksPerTick;
|
||||
private $clearChunksOnTick;
|
||||
private $randomTickBlocks = [
|
||||
Block::GRASS => Grass::class,
|
||||
Block::SAPLING => Sapling::class,
|
||||
Block::LEAVES => Leaves::class,
|
||||
Block::WHEAT_BLOCK => Wheat::class,
|
||||
Block::FARMLAND => Farmland::class,
|
||||
Block::SNOW_LAYER => SnowLayer::class,
|
||||
Block::ICE => Ice::class,
|
||||
Block::CACTUS => Cactus::class,
|
||||
Block::SUGARCANE_BLOCK => Sugarcane::class,
|
||||
Block::RED_MUSHROOM => RedMushroom::class,
|
||||
Block::BROWN_MUSHROOM => BrownMushroom::class,
|
||||
Block::PUMPKIN_STEM => PumpkinStem::class,
|
||||
Block::MELON_STEM => MelonStem::class,
|
||||
//Block::VINE => true,
|
||||
Block::MYCELIUM => Mycelium::class,
|
||||
//Block::COCOA_BLOCK => true,
|
||||
Block::CARROT_BLOCK => Carrot::class,
|
||||
Block::POTATO_BLOCK => Potato::class,
|
||||
Block::LEAVES2 => Leaves2::class,
|
||||
Block::FIRE => Fire::class,
|
||||
Block::BEETROOT_BLOCK => Beetroot::class,
|
||||
Block::NETHER_WART_PLANT => NetherWartPlant::class
|
||||
];
|
||||
/** @var \SplFixedArray<Block> */
|
||||
private $randomTickBlocks = null;
|
||||
|
||||
/** @var LevelTimings */
|
||||
public $timings;
|
||||
@ -346,10 +304,19 @@ class Level implements ChunkManager, Metadatable{
|
||||
$this->clearChunksOnTick = (bool) $this->server->getProperty("chunk-ticking.clear-tick-list", true);
|
||||
$this->cacheChunks = (bool) $this->server->getProperty("chunk-sending.cache-chunks", false);
|
||||
|
||||
$this->randomTickBlocks = \SplFixedArray::fromArray(array_filter(BlockFactory::$list->toArray(), function(Block $block = null){
|
||||
return $block !== null and $block->ticksRandomly();
|
||||
}));
|
||||
$this->randomTickBlocks->setSize(256);
|
||||
|
||||
$dontTickBlocks = $this->server->getProperty("chunk-ticking.disable-block-ticking", []);
|
||||
foreach($dontTickBlocks as $id){
|
||||
if(isset($this->randomTickBlocks[$id])){
|
||||
unset($this->randomTickBlocks[$id]);
|
||||
try{
|
||||
if(isset($this->randomTickBlocks[$id])){
|
||||
$this->randomTickBlocks[$id] = null;
|
||||
}
|
||||
}catch(\RuntimeException $e){
|
||||
//index out of bounds
|
||||
}
|
||||
}
|
||||
|
||||
@ -916,11 +883,11 @@ class Level implements ChunkManager, Metadatable{
|
||||
}
|
||||
|
||||
public function addRandomTickedBlock(int $id){
|
||||
$this->randomTickBlocks[$id] = get_class(BlockFactory::$list[$id]);
|
||||
$this->randomTickBlocks[$id] = BlockFactory::get($id);
|
||||
}
|
||||
|
||||
public function removeRandomTickedBlock(int $id){
|
||||
unset($this->randomTickBlocks[$id]);
|
||||
$this->randomTickBlocks[$id] = null;
|
||||
}
|
||||
|
||||
private function tickChunks(){
|
||||
@ -975,10 +942,11 @@ class Level implements ChunkManager, Metadatable{
|
||||
$z = ($k >> 8) & 0x0f;
|
||||
|
||||
$blockId = $subChunk->getBlockId($x, $y, $z);
|
||||
if(isset($this->randomTickBlocks[$blockId])){
|
||||
$class = $this->randomTickBlocks[$blockId];
|
||||
if($this->randomTickBlocks[$blockId] !== null){
|
||||
/** @var Block $block */
|
||||
$block = new $class($subChunk->getBlockData($x, $y, $z));
|
||||
$block = clone $this->randomTickBlocks[$blockId];
|
||||
$block->setDamage($subChunk->getBlockData($x, $y, $z));
|
||||
|
||||
$block->x = $chunkX * 16 + $x;
|
||||
$block->y = ($Y << 4) + $y;
|
||||
$block->z = $chunkZ * 16 + $z;
|
||||
|
Reference in New Issue
Block a user