diff --git a/src/pocketmine/block/Anvil.php b/src/pocketmine/block/Anvil.php index 1a035b355..9c7bc8a5c 100644 --- a/src/pocketmine/block/Anvil.php +++ b/src/pocketmine/block/Anvil.php @@ -24,6 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\BlockDataValidator; +use pocketmine\block\utils\Fallable; +use pocketmine\block\utils\FallableTrait; use pocketmine\inventory\AnvilInventory; use pocketmine\item\Item; use pocketmine\item\TieredTool; @@ -33,7 +35,8 @@ use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\Player; -class Anvil extends Fallable{ +class Anvil extends Transparent implements Fallable{ + use FallableTrait; public const TYPE_NORMAL = 0; public const TYPE_SLIGHTLY_DAMAGED = 4; @@ -54,10 +57,6 @@ class Anvil extends Fallable{ return 0b11; } - public function isTransparent() : bool{ - return true; - } - public function getHardness() : float{ return 5; } @@ -92,4 +91,8 @@ class Anvil extends Fallable{ } return parent::place($item, $blockReplace, $blockClicked, $face, $clickVector, $player); } + + public function tickFalling() : ?Block{ + return null; + } } diff --git a/src/pocketmine/block/ConcretePowder.php b/src/pocketmine/block/ConcretePowder.php index 5eff4ef02..3ff091612 100644 --- a/src/pocketmine/block/ConcretePowder.php +++ b/src/pocketmine/block/ConcretePowder.php @@ -23,9 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\Fallable; +use pocketmine\block\utils\FallableTrait; use pocketmine\math\Facing; -class ConcretePowder extends Fallable{ +class ConcretePowder extends Solid implements Fallable{ + use FallableTrait { + onNearbyBlockChange as protected startFalling; + } public function getHardness() : float{ return 0.5; @@ -39,7 +44,7 @@ class ConcretePowder extends Fallable{ if(($block = $this->checkAdjacentWater()) !== null){ $this->level->setBlock($this, $block); }else{ - parent::onNearbyBlockChange(); + $this->startFalling(); } } diff --git a/src/pocketmine/block/Gravel.php b/src/pocketmine/block/Gravel.php index 14227ff18..939b0e801 100644 --- a/src/pocketmine/block/Gravel.php +++ b/src/pocketmine/block/Gravel.php @@ -23,11 +23,14 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\Fallable; +use pocketmine\block\utils\FallableTrait; use pocketmine\item\Item; use pocketmine\item\ItemFactory; use function mt_rand; -class Gravel extends Fallable{ +class Gravel extends Solid implements Fallable{ + use FallableTrait; protected $id = self::GRAVEL; @@ -56,4 +59,8 @@ class Gravel extends Fallable{ return parent::getDropsForCompatibleTool($item); } + + public function tickFalling() : ?Block{ + return null; + } } diff --git a/src/pocketmine/block/Sand.php b/src/pocketmine/block/Sand.php index 6c6a12a7d..4b45bebce 100644 --- a/src/pocketmine/block/Sand.php +++ b/src/pocketmine/block/Sand.php @@ -23,7 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -class Sand extends Fallable{ +use pocketmine\block\utils\Fallable; +use pocketmine\block\utils\FallableTrait; + +class Sand extends Solid implements Fallable{ + use FallableTrait; public function getHardness() : float{ return 0.5; @@ -32,4 +36,8 @@ class Sand extends Fallable{ public function getToolType() : int{ return BlockToolType::TYPE_SHOVEL; } + + public function tickFalling() : ?Block{ + return null; + } } diff --git a/src/pocketmine/block/utils/Fallable.php b/src/pocketmine/block/utils/Fallable.php new file mode 100644 index 000000000..1eb3cd12d --- /dev/null +++ b/src/pocketmine/block/utils/Fallable.php @@ -0,0 +1,38 @@ +getSide(Facing::DOWN); - if($down->getId() === self::AIR or $down instanceof Liquid or $down instanceof Fire){ - $this->level->setBlock($this, BlockFactory::get(Block::AIR)); + $pos = $this->asPosition(); + $down = $pos->level->getBlock($pos->getSide(Facing::DOWN)); + if($down->getId() === Block::AIR or $down instanceof Liquid or $down instanceof Fire){ + $pos->level->setBlock($pos, BlockFactory::get(Block::AIR)); - $nbt = EntityFactory::createBaseNBT($this->add(0.5, 0, 0.5)); + $nbt = EntityFactory::createBaseNBT($pos->add(0.5, 0, 0.5)); $nbt->setInt("TileID", $this->getId()); $nbt->setByte("Data", $this->getDamage()); /** @var FallingBlock $fall */ - $fall = EntityFactory::create(FallingBlock::class, $this->getLevel(), $nbt); + $fall = EntityFactory::create(FallingBlock::class, $pos->getLevel(), $nbt); $fall->spawnToAll(); } } - - /** - * @return null|Block - */ - public function tickFalling() : ?Block{ - return null; - } } diff --git a/src/pocketmine/entity/object/FallingBlock.php b/src/pocketmine/entity/object/FallingBlock.php index 626111072..c90c9c36e 100644 --- a/src/pocketmine/entity/object/FallingBlock.php +++ b/src/pocketmine/entity/object/FallingBlock.php @@ -25,7 +25,7 @@ namespace pocketmine\entity\object; use pocketmine\block\Block; use pocketmine\block\BlockFactory; -use pocketmine\block\Fallable; +use pocketmine\block\utils\Fallable; use pocketmine\entity\Entity; use pocketmine\event\entity\EntityBlockChangeEvent; use pocketmine\event\entity\EntityDamageEvent;