diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index fe55ae54d..38d63509b 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -1134,9 +1134,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ $pk->pitch = $this->pitch; $pk->bodyYaw = $this->yaw; - foreach($this->hasSpawned as $player){ - $player->dataPacket($pk); - } + Server::broadcastPacket($this->hasSpawned, $pk); } } } diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 21c49ad22..26fc04d52 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1692,8 +1692,10 @@ class Server{ * @param DataPacket $packet */ public static function broadcastPacket(array $players, DataPacket $packet){ + $packet->encode(); + $packet->isEncoded = true; foreach($players as $player){ - $player->dataPacket(clone $packet); + $player->dataPacket($packet); } } diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index 1e7fe8a48..ebf1bd73a 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -273,6 +273,8 @@ abstract class Entity extends Location implements Metadatable{ $pk = new SetEntityDataPacket(); $pk->eid = $this->id; $pk->metadata = $this->getData(); + $pk->encode(); + $pk->isEncoded = true; foreach($player as $p){ if($p === $this){ /** @var Player $p */ @@ -546,9 +548,7 @@ abstract class Entity extends Location implements Metadatable{ ]; } - foreach($this->hasSpawned as $player){ - $player->dataPacket($pk); - } + Server::broadcastPacket($this->hasSpawned, $pk); } if(($this->lastMotionX != $this->motionX or $this->lastMotionY != $this->motionY or $this->lastMotionZ != $this->motionZ)){ @@ -560,9 +560,8 @@ abstract class Entity extends Location implements Metadatable{ $pk->entities = [ [$this->getID(), $this->motionX, $this->motionY, $this->motionZ] ]; - foreach($this->hasSpawned as $player){ - $player->dataPacket($pk); - } + + Server::broadcastPacket($this->hasSpawned, $pk); if($this instanceof Player){ $this->motionX = 0; diff --git a/src/pocketmine/inventory/BaseInventory.php b/src/pocketmine/inventory/BaseInventory.php index 6b6e50737..14c5ae64b 100644 --- a/src/pocketmine/inventory/BaseInventory.php +++ b/src/pocketmine/inventory/BaseInventory.php @@ -388,6 +388,8 @@ abstract class BaseInventory implements Inventory{ for($i = 0; $i < $this->getSize(); ++$i){ $pk->slots[$i] = $this->getItem($i); } + $pk->isEncoded = true; + $pk->encode(); foreach($target as $player){ if(($id = $player->getWindowId($this)) === -1 or $player->spawned !== true){ @@ -395,7 +397,7 @@ abstract class BaseInventory implements Inventory{ continue; } $pk->windowid = $id; - $player->dataPacket(clone $pk); + $player->dataPacket($pk); } } @@ -411,6 +413,8 @@ abstract class BaseInventory implements Inventory{ $pk = new ContainerSetSlotPacket; $pk->slot = $index; $pk->item = clone $this->getItem($index); + $pk->encode(); + $pk->isEncoded = true; foreach($target as $player){ if(($id = $player->getWindowId($this)) === -1){ @@ -418,7 +422,7 @@ abstract class BaseInventory implements Inventory{ continue; } $pk->windowid = $id; - $player->dataPacket(clone $pk); + $player->dataPacket($pk); } } diff --git a/src/pocketmine/inventory/PlayerInventory.php b/src/pocketmine/inventory/PlayerInventory.php index 7fec0bdeb..ec1ee6be7 100644 --- a/src/pocketmine/inventory/PlayerInventory.php +++ b/src/pocketmine/inventory/PlayerInventory.php @@ -72,9 +72,7 @@ class PlayerInventory extends BaseInventory{ $pk->meta = $item->getDamage(); $pk->slot = $this->getHeldItemIndex(); - foreach($this->getHolder()->getViewers() as $player){ - $player->dataPacket(clone $pk); - } + Server::broadcastPacket($this->getHolder()->getViewers(), $pk); } } @@ -133,6 +131,8 @@ class PlayerInventory extends BaseInventory{ $pk->item = $item->getID(); $pk->meta = $item->getDamage(); $pk->slot = 0; + $pk->isEncoded = true; + $pk->encode(); foreach($target as $player){ if($player === $this->getHolder()){ @@ -140,7 +140,7 @@ class PlayerInventory extends BaseInventory{ //$this->sendSlot($this->getHeldItemSlot()); $this->sendContents($player); }else{ - $player->dataPacket(clone $pk); + $player->dataPacket($pk); } } } @@ -289,6 +289,8 @@ class PlayerInventory extends BaseInventory{ $pk = new PlayerArmorEquipmentPacket; $pk->eid = $this->getHolder()->getID(); $pk->slots = $slots; + $pk->encode(); + $pk->isEncoded = true; foreach($target as $player){ if($player === $this->getHolder()){ @@ -301,7 +303,7 @@ class PlayerInventory extends BaseInventory{ $pk2->slots = $armor; $player->dataPacket($pk2); }else{ - $player->dataPacket(clone $pk); + $player->dataPacket($pk); } } } diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index ac40c4e21..24679a93c 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -434,9 +434,8 @@ class Level implements ChunkManager, Metadatable{ $pk = new SetTimePacket; $pk->time = (int) $this->time; $pk->started = $this->stopTime == false; - foreach($this->players as $player){ - $player->dataPacket($pk); - } + + Server::broadcastPacket($this->players, $pk); } /** @@ -535,9 +534,7 @@ class Level implements ChunkManager, Metadatable{ $pk->z = $b->z; $pk->block = $b->getID(); $pk->meta = $b->getDamage(); - foreach($this->getUsingChunk($b->x >> 4, $b->z >> 4) as $player){ - $player->dataPacket($pk); - } + Server::broadcastPacket($this->getUsingChunk($b->x >> 4, $b->z >> 4), $pk); } } } @@ -945,10 +942,7 @@ class Level implements ChunkManager, Metadatable{ $pk->block = $block->getID(); $pk->meta = $block->getDamage(); - foreach($this->getUsingChunk($pos->x >> 4, $pos->z >> 4) as $player){ - /** @var Player $player */ - $player->dataPacket($pk); - } + Server::broadcastPacket($this->getUsingChunk($pos->x >> 4, $pos->z >> 4), $pk); /*}else{ if(!($pos instanceof Position)){ $pos = new Position($pos->x, $pos->y, $pos->z, $this); diff --git a/src/pocketmine/network/RakLibInterface.php b/src/pocketmine/network/RakLibInterface.php index ac42cc546..76d660a30 100644 --- a/src/pocketmine/network/RakLibInterface.php +++ b/src/pocketmine/network/RakLibInterface.php @@ -215,7 +215,9 @@ class RakLibInterface implements ServerInstance, SourceInterface{ public function putPacket(Player $player, DataPacket $packet, $needACK = false, $immediate = false){ if(isset($this->identifiers[$player])){ $identifier = $this->identifiers[$player]; - $packet->encode(); + if(!$packet->isEncoded){ + $packet->encode(); + } $pk = new EncapsulatedPacket(); $pk->buffer = $packet->buffer; $pk->reliability = 2; diff --git a/src/pocketmine/network/protocol/DataPacket.php b/src/pocketmine/network/protocol/DataPacket.php index 3a13eebcd..8ee9b9601 100644 --- a/src/pocketmine/network/protocol/DataPacket.php +++ b/src/pocketmine/network/protocol/DataPacket.php @@ -27,6 +27,7 @@ use pocketmine\utils\Binary; abstract class DataPacket extends \stdClass{ private $offset = 0; public $buffer = ""; + public $isEncoded = false; abstract public function pid();