From fc9c264e779a924137e43f6a5b8d77898e845a48 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 3 Oct 2017 19:28:01 +0100 Subject: [PATCH] Resend blocks around targeted blocks when interactions & block-break are cancelled, fixes #906 this solution is dumber but more effective (also solves the beds & doors placement problem) --- src/pocketmine/Player.php | 25 +++++++++++++++++-------- src/pocketmine/block/Block.php | 29 +++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 8be31b12a..b6d8b4b37 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -2362,10 +2362,14 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ if($blockVector->distanceSquared($this) > 10000){ return true; } + $target = $this->level->getBlock($blockVector); $block = $target->getSide($face); - $this->level->sendBlocks([$this], [$target, $block], UpdateBlockPacket::FLAG_ALL_PRIORITY); + /** @var Block[] $blocks */ + $blocks = array_merge($target->getAllSides(), $block->getAllSides()); //getAllSides() on each of these will include $target and $block because they are next to each other + + $this->level->sendBlocks([$this], $blocks, UpdateBlockPacket::FLAG_ALL_PRIORITY); return true; case InventoryTransactionPacket::USE_ITEM_ACTION_BREAK_BLOCK: @@ -2391,15 +2395,20 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ } $this->inventory->sendContents($this); - $target = $this->level->getBlock($blockVector); - $tile = $this->level->getTile($blockVector); - - $this->level->sendBlocks([$this], [$target], UpdateBlockPacket::FLAG_ALL_PRIORITY); - $this->inventory->sendHeldItem($this); - if($tile instanceof Spawnable){ - $tile->spawnTo($this); + $target = $this->level->getBlock($blockVector); + /** @var Block[] $blocks */ + $blocks = $target->getAllSides(); + $blocks[] = $target; + + $this->level->sendBlocks([$this], $blocks, UpdateBlockPacket::FLAG_ALL_PRIORITY); + + foreach($blocks as $b){ + $tile = $this->level->getTile($blockVector); + if($tile instanceof Spawnable){ + $tile->spawnTo($this); + } } return true; diff --git a/src/pocketmine/block/Block.php b/src/pocketmine/block/Block.php index 0632c317a..9dc416a00 100644 --- a/src/pocketmine/block/Block.php +++ b/src/pocketmine/block/Block.php @@ -445,6 +445,35 @@ class Block extends Position implements BlockIds, Metadatable{ return BlockFactory::get(Block::AIR, 0, Position::fromObject(Vector3::getSide($side, $step))); } + /** + * Returns the 4 blocks on the horizontal axes around the block (north, south, east, west) + * + * @return Block[] + */ + public function getHorizontalSides() : array{ + return [ + $this->getSide(Vector3::SIDE_NORTH), + $this->getSide(Vector3::SIDE_SOUTH), + $this->getSide(Vector3::SIDE_WEST), + $this->getSide(Vector3::SIDE_EAST) + ]; + } + + /** + * Returns the six blocks around this block. + * + * @return Block[] + */ + public function getAllSides() : array{ + return array_merge( + [ + $this->getSide(Vector3::SIDE_DOWN), + $this->getSide(Vector3::SIDE_UP) + ], + $this->getHorizontalSides() + ); + } + /** * @return string */