From 0be2bd911f2ce72afe8bfa783efdf0a4f167728c Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Sun, 22 Jun 2014 21:56:58 +0200 Subject: [PATCH] Fixed block updates not getting broadcasted --- src/pocketmine/block/Grass.php | 5 +++++ src/pocketmine/level/Level.php | 16 +++++++++++----- src/pocketmine/level/format/ChunkSection.php | 2 ++ .../level/format/anvil/ChunkSection.php | 17 ++++++++++++++++- .../level/format/generic/BaseChunk.php | 2 +- 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/pocketmine/block/Grass.php b/src/pocketmine/block/Grass.php index 13674cd6b..a4b324217 100644 --- a/src/pocketmine/block/Grass.php +++ b/src/pocketmine/block/Grass.php @@ -23,6 +23,7 @@ namespace pocketmine\block; use pocketmine\item\Item; use pocketmine\level\generator\object\TallGrass; +use pocketmine\level\Level; use pocketmine\Player; use pocketmine\utils\Random; @@ -39,6 +40,10 @@ class Grass extends Solid{ ); } + public function onUpdate($type){ + + } + public function onActivate(Item $item, Player $player = null){ if($item->getID() === Item::DYE and $item->getDamage() === 0x0F){ $item->count--; diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index b3d2afc4f..a505efedc 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -318,7 +318,9 @@ class Level implements ChunkManager, Metadatable{ $pk = new SetTimePacket; $pk->time = (int) $this->time; $pk->started = $this->stopTime == false; - $this->server->broadcastPacket($this->players, $pk); + foreach($this->players as $player){ + $player->dataPacket($pk); + } return; } @@ -357,7 +359,6 @@ class Level implements ChunkManager, Metadatable{ } } $this->changedCount = []; - if(count($this->changedBlocks) > 0){ foreach($this->changedBlocks as $index => $mini){ foreach($mini as $blocks){ @@ -369,7 +370,9 @@ class Level implements ChunkManager, Metadatable{ $pk->z = $b->z; $pk->block = $b->getID(); $pk->meta = $b->getDamage(); - $this->server->broadcastPacket($this->players, $pk); + foreach($this->players as $player){ + $player->dataPacket($pk); + } } } } @@ -574,8 +577,11 @@ class Level implements ChunkManager, Metadatable{ $pk->z = $pos->z; $pk->block = $block->getID(); $pk->meta = $block->getDamage(); - $this->server->broadcastPacket($this->players, $pk); - }elseif($direct === false){ + + foreach($this->players as $player){ + $player->dataPacket($pk); + } + }else{ if(!($pos instanceof Position)){ $pos = new Position($pos->x, $pos->y, $pos->z, $this); } diff --git a/src/pocketmine/level/format/ChunkSection.php b/src/pocketmine/level/format/ChunkSection.php index a3929a8fc..45d11dfe3 100644 --- a/src/pocketmine/level/format/ChunkSection.php +++ b/src/pocketmine/level/format/ChunkSection.php @@ -79,6 +79,8 @@ interface ChunkSection{ * @param int $z 0-15 * @param int $blockId , if null, do not change * @param int $meta 0-15, if null, do not change + * + * @return bool */ public function setBlock($x, $y, $z, $blockId = null, $meta = null); diff --git a/src/pocketmine/level/format/anvil/ChunkSection.php b/src/pocketmine/level/format/anvil/ChunkSection.php index 6ba904328..3688106c2 100644 --- a/src/pocketmine/level/format/anvil/ChunkSection.php +++ b/src/pocketmine/level/format/anvil/ChunkSection.php @@ -83,8 +83,15 @@ class ChunkSection implements \pocketmine\level\format\ChunkSection{ public function setBlock($x, $y, $z, $blockId = null, $meta = null){ $i = ($y << 8) + ($z << 4) + $x; + + $changed = false; + if($blockId !== null){ - $this->blocks{$i} = chr($blockId); + $blockId = chr($blockId); + if($this->blocks{$i} !== $blockId){ + $this->blocks{$i} = $blockId; + $changed = true; + } } if($meta !== null){ @@ -92,10 +99,18 @@ class ChunkSection implements \pocketmine\level\format\ChunkSection{ $old_m = ord($this->data{$i}); if(($x & 1) === 0){ $this->data{$i} = chr(($old_m & 0xf0) | ($meta & 0x0f)); + if(($old_m & 0x0f) !== $meta){ + $changed = true; + } }else{ $this->data{$i} = chr((($meta & 0x0f) << 4) | ($old_m & 0x0f)); + if((($old_m & 0xf0) >> 4) !== $meta){ + $changed = true; + } } } + + return $changed; } public function getBlockSkyLight($x, $y, $z){ diff --git a/src/pocketmine/level/format/generic/BaseChunk.php b/src/pocketmine/level/format/generic/BaseChunk.php index 037d835f2..67198339f 100644 --- a/src/pocketmine/level/format/generic/BaseChunk.php +++ b/src/pocketmine/level/format/generic/BaseChunk.php @@ -157,7 +157,7 @@ abstract class BaseChunk implements Chunk{ } public function setBlock($x, $y, $z, $blockId = null, $meta = null){ - $this->sections[$y >> 4]->setBlock($x, $y & 0x0f, $z, $blockId, $meta); + return $this->sections[$y >> 4]->setBlock($x, $y & 0x0f, $z, $blockId & 0xff, $meta & 0x0f); } public function getBlockId($x, $y, $z){