diff --git a/src/pocketmine/block/Air.php b/src/pocketmine/block/Air.php index e8f519a96..a58ad31a3 100644 --- a/src/pocketmine/block/Air.php +++ b/src/pocketmine/block/Air.php @@ -54,7 +54,7 @@ class Air extends Transparent{ return true; } - public function canBeReplaced() : bool{ + public function canBeReplaced(Block $with = null) : bool{ return true; } diff --git a/src/pocketmine/block/Block.php b/src/pocketmine/block/Block.php index 5970a865e..526099b2e 100644 --- a/src/pocketmine/block/Block.php +++ b/src/pocketmine/block/Block.php @@ -597,9 +597,11 @@ class Block extends Position implements BlockIds, Metadatable{ } /** + * @param Block|null $with + * * @return bool */ - public function canBeReplaced() : bool{ + public function canBeReplaced(Block $with = null) : bool{ return false; } diff --git a/src/pocketmine/block/DoublePlant.php b/src/pocketmine/block/DoublePlant.php index 386dcf4c0..0d820a2a0 100644 --- a/src/pocketmine/block/DoublePlant.php +++ b/src/pocketmine/block/DoublePlant.php @@ -37,7 +37,7 @@ class DoublePlant extends Flowable{ $this->meta = $meta; } - public function canBeReplaced() : bool{ + public function canBeReplaced(Block $with = null) : bool{ return $this->meta === 2 or $this->meta === 3; //grass or fern } diff --git a/src/pocketmine/block/Fire.php b/src/pocketmine/block/Fire.php index e0825d65a..8e4878339 100644 --- a/src/pocketmine/block/Fire.php +++ b/src/pocketmine/block/Fire.php @@ -57,7 +57,7 @@ class Fire extends Flowable{ return false; } - public function canBeReplaced() : bool{ + public function canBeReplaced(Block $with = null) : bool{ return true; } diff --git a/src/pocketmine/block/Liquid.php b/src/pocketmine/block/Liquid.php index 254196938..1178e3a62 100644 --- a/src/pocketmine/block/Liquid.php +++ b/src/pocketmine/block/Liquid.php @@ -41,7 +41,7 @@ abstract class Liquid extends Transparent{ return false; } - public function canBeReplaced() : bool{ + public function canBeReplaced(Block $with = null) : bool{ return true; } diff --git a/src/pocketmine/block/SnowLayer.php b/src/pocketmine/block/SnowLayer.php index 12d617eb4..eca0c9492 100644 --- a/src/pocketmine/block/SnowLayer.php +++ b/src/pocketmine/block/SnowLayer.php @@ -41,7 +41,7 @@ class SnowLayer extends Flowable{ return "Snow Layer"; } - public function canBeReplaced() : bool{ + public function canBeReplaced(Block $with = null) : bool{ return true; } diff --git a/src/pocketmine/block/TallGrass.php b/src/pocketmine/block/TallGrass.php index 73723aa25..eb8d93d55 100644 --- a/src/pocketmine/block/TallGrass.php +++ b/src/pocketmine/block/TallGrass.php @@ -36,7 +36,7 @@ class TallGrass extends Flowable{ $this->meta = $meta; } - public function canBeReplaced() : bool{ + public function canBeReplaced(Block $with = null) : bool{ return true; } diff --git a/src/pocketmine/block/WoodenSlab.php b/src/pocketmine/block/WoodenSlab.php index 320640944..7310145a0 100644 --- a/src/pocketmine/block/WoodenSlab.php +++ b/src/pocketmine/block/WoodenSlab.php @@ -78,6 +78,10 @@ class WoodenSlab extends Transparent{ } } + public function canBeReplaced(Block $with = null) : bool{ + return $with !== null and $with->getId() === $this->getId() and ($with->getDamage() & 0x07) === ($this->getDamage() & 0x07); + } + public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{ $this->meta &= 0x07; if($face === Vector3::SIDE_DOWN){ diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 60f4dee34..b6ac770ae 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -1777,23 +1777,20 @@ class Level implements ChunkManager, Metadatable{ return true; } - if($item->canBePlaced()){ - $hand = $item->getBlock(); - $hand->position($block); - }else{ + if(!$item->canBePlaced()){ return false; } - if(!($block->canBeReplaced() === true or ($hand->getId() === Item::WOODEN_SLAB and $block->getId() === Item::WOODEN_SLAB) or ($hand->getId() === Item::STONE_SLAB and $block->getId() === Item::STONE_SLAB))){ - return false; - } + $hand = $item->getBlock(); - if($target->canBeReplaced() === true){ + if($target->canBeReplaced($hand)){ $block = $target; - $hand->position($block); - //$face = -1; + }elseif(!$block->canBeReplaced($hand)){ + return false; } + $hand->position($block); + if($hand->isSolid() === true and $hand->getBoundingBox() !== null){ $entities = $this->getCollidingEntities($hand->getBoundingBox()); $realCount = 0; @@ -1834,7 +1831,7 @@ class Level implements ChunkManager, Metadatable{ } } - if($hand->place($item, $block, $target, $face, $facePos, $player) === false){ + if(!$hand->place($item, $block, $target, $face, $facePos, $player)){ return false; }