Skip to content

Commit

Permalink
Resend blocks around targeted blocks when interactions & block-break …
Browse files Browse the repository at this point in the history
…are cancelled, fixes pmmp#906

this solution is dumber but more effective (also solves the beds & doors placement problem)
  • Loading branch information
dktapps committed Oct 3, 2017
1 parent 04ba41c commit fc9c264
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 7 deletions.
23 changes: 16 additions & 7 deletions src/pocketmine/Player.php
Original file line number Diff line number Diff line change
Expand Up @@ -2362,10 +2362,14 @@ public function handleInventoryTransaction(InventoryTransactionPacket $packet) :
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:
Expand All @@ -2391,15 +2395,20 @@ public function handleInventoryTransaction(InventoryTransactionPacket $packet) :
}

$this->inventory->sendContents($this);
$target = $this->level->getBlock($blockVector);
$tile = $this->level->getTile($blockVector);
$this->inventory->sendHeldItem($this);

$this->level->sendBlocks([$this], [$target], UpdateBlockPacket::FLAG_ALL_PRIORITY);
$target = $this->level->getBlock($blockVector);
/** @var Block[] $blocks */
$blocks = $target->getAllSides();
$blocks[] = $target;

$this->inventory->sendHeldItem($this);
$this->level->sendBlocks([$this], $blocks, UpdateBlockPacket::FLAG_ALL_PRIORITY);

if($tile instanceof Spawnable){
$tile->spawnTo($this);
foreach($blocks as $b){
$tile = $this->level->getTile($blockVector);
if($tile instanceof Spawnable){
$tile->spawnTo($this);
}
}

return true;
Expand Down
29 changes: 29 additions & 0 deletions src/pocketmine/block/Block.php
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,35 @@ public function getSide($side, $step = 1){
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
*/
Expand Down

0 comments on commit fc9c264

Please sign in to comment.