Improved broadcast packet encoding

This commit is contained in:
Shoghi Cervantes 2014-10-17 09:36:47 +02:00
parent 9cb27e26ef
commit 94e9485be9
8 changed files with 30 additions and 28 deletions

View File

@ -1134,9 +1134,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
$pk->pitch = $this->pitch; $pk->pitch = $this->pitch;
$pk->bodyYaw = $this->yaw; $pk->bodyYaw = $this->yaw;
foreach($this->hasSpawned as $player){ Server::broadcastPacket($this->hasSpawned, $pk);
$player->dataPacket($pk);
}
} }
} }
} }

View File

@ -1692,8 +1692,10 @@ class Server{
* @param DataPacket $packet * @param DataPacket $packet
*/ */
public static function broadcastPacket(array $players, DataPacket $packet){ public static function broadcastPacket(array $players, DataPacket $packet){
$packet->encode();
$packet->isEncoded = true;
foreach($players as $player){ foreach($players as $player){
$player->dataPacket(clone $packet); $player->dataPacket($packet);
} }
} }

View File

@ -273,6 +273,8 @@ abstract class Entity extends Location implements Metadatable{
$pk = new SetEntityDataPacket(); $pk = new SetEntityDataPacket();
$pk->eid = $this->id; $pk->eid = $this->id;
$pk->metadata = $this->getData(); $pk->metadata = $this->getData();
$pk->encode();
$pk->isEncoded = true;
foreach($player as $p){ foreach($player as $p){
if($p === $this){ if($p === $this){
/** @var Player $p */ /** @var Player $p */
@ -546,9 +548,7 @@ abstract class Entity extends Location implements Metadatable{
]; ];
} }
foreach($this->hasSpawned as $player){ Server::broadcastPacket($this->hasSpawned, $pk);
$player->dataPacket($pk);
}
} }
if(($this->lastMotionX != $this->motionX or $this->lastMotionY != $this->motionY or $this->lastMotionZ != $this->motionZ)){ 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 = [ $pk->entities = [
[$this->getID(), $this->motionX, $this->motionY, $this->motionZ] [$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){ if($this instanceof Player){
$this->motionX = 0; $this->motionX = 0;

View File

@ -388,6 +388,8 @@ abstract class BaseInventory implements Inventory{
for($i = 0; $i < $this->getSize(); ++$i){ for($i = 0; $i < $this->getSize(); ++$i){
$pk->slots[$i] = $this->getItem($i); $pk->slots[$i] = $this->getItem($i);
} }
$pk->isEncoded = true;
$pk->encode();
foreach($target as $player){ foreach($target as $player){
if(($id = $player->getWindowId($this)) === -1 or $player->spawned !== true){ if(($id = $player->getWindowId($this)) === -1 or $player->spawned !== true){
@ -395,7 +397,7 @@ abstract class BaseInventory implements Inventory{
continue; continue;
} }
$pk->windowid = $id; $pk->windowid = $id;
$player->dataPacket(clone $pk); $player->dataPacket($pk);
} }
} }
@ -411,6 +413,8 @@ abstract class BaseInventory implements Inventory{
$pk = new ContainerSetSlotPacket; $pk = new ContainerSetSlotPacket;
$pk->slot = $index; $pk->slot = $index;
$pk->item = clone $this->getItem($index); $pk->item = clone $this->getItem($index);
$pk->encode();
$pk->isEncoded = true;
foreach($target as $player){ foreach($target as $player){
if(($id = $player->getWindowId($this)) === -1){ if(($id = $player->getWindowId($this)) === -1){
@ -418,7 +422,7 @@ abstract class BaseInventory implements Inventory{
continue; continue;
} }
$pk->windowid = $id; $pk->windowid = $id;
$player->dataPacket(clone $pk); $player->dataPacket($pk);
} }
} }

View File

@ -72,9 +72,7 @@ class PlayerInventory extends BaseInventory{
$pk->meta = $item->getDamage(); $pk->meta = $item->getDamage();
$pk->slot = $this->getHeldItemIndex(); $pk->slot = $this->getHeldItemIndex();
foreach($this->getHolder()->getViewers() as $player){ Server::broadcastPacket($this->getHolder()->getViewers(), $pk);
$player->dataPacket(clone $pk);
}
} }
} }
@ -133,6 +131,8 @@ class PlayerInventory extends BaseInventory{
$pk->item = $item->getID(); $pk->item = $item->getID();
$pk->meta = $item->getDamage(); $pk->meta = $item->getDamage();
$pk->slot = 0; $pk->slot = 0;
$pk->isEncoded = true;
$pk->encode();
foreach($target as $player){ foreach($target as $player){
if($player === $this->getHolder()){ if($player === $this->getHolder()){
@ -140,7 +140,7 @@ class PlayerInventory extends BaseInventory{
//$this->sendSlot($this->getHeldItemSlot()); //$this->sendSlot($this->getHeldItemSlot());
$this->sendContents($player); $this->sendContents($player);
}else{ }else{
$player->dataPacket(clone $pk); $player->dataPacket($pk);
} }
} }
} }
@ -289,6 +289,8 @@ class PlayerInventory extends BaseInventory{
$pk = new PlayerArmorEquipmentPacket; $pk = new PlayerArmorEquipmentPacket;
$pk->eid = $this->getHolder()->getID(); $pk->eid = $this->getHolder()->getID();
$pk->slots = $slots; $pk->slots = $slots;
$pk->encode();
$pk->isEncoded = true;
foreach($target as $player){ foreach($target as $player){
if($player === $this->getHolder()){ if($player === $this->getHolder()){
@ -301,7 +303,7 @@ class PlayerInventory extends BaseInventory{
$pk2->slots = $armor; $pk2->slots = $armor;
$player->dataPacket($pk2); $player->dataPacket($pk2);
}else{ }else{
$player->dataPacket(clone $pk); $player->dataPacket($pk);
} }
} }
} }

View File

@ -434,9 +434,8 @@ class Level implements ChunkManager, Metadatable{
$pk = new SetTimePacket; $pk = new SetTimePacket;
$pk->time = (int) $this->time; $pk->time = (int) $this->time;
$pk->started = $this->stopTime == false; $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->z = $b->z;
$pk->block = $b->getID(); $pk->block = $b->getID();
$pk->meta = $b->getDamage(); $pk->meta = $b->getDamage();
foreach($this->getUsingChunk($b->x >> 4, $b->z >> 4) as $player){ Server::broadcastPacket($this->getUsingChunk($b->x >> 4, $b->z >> 4), $pk);
$player->dataPacket($pk);
}
} }
} }
} }
@ -945,10 +942,7 @@ class Level implements ChunkManager, Metadatable{
$pk->block = $block->getID(); $pk->block = $block->getID();
$pk->meta = $block->getDamage(); $pk->meta = $block->getDamage();
foreach($this->getUsingChunk($pos->x >> 4, $pos->z >> 4) as $player){ Server::broadcastPacket($this->getUsingChunk($pos->x >> 4, $pos->z >> 4), $pk);
/** @var Player $player */
$player->dataPacket($pk);
}
/*}else{ /*}else{
if(!($pos instanceof Position)){ if(!($pos instanceof Position)){
$pos = new Position($pos->x, $pos->y, $pos->z, $this); $pos = new Position($pos->x, $pos->y, $pos->z, $this);

View File

@ -215,7 +215,9 @@ class RakLibInterface implements ServerInstance, SourceInterface{
public function putPacket(Player $player, DataPacket $packet, $needACK = false, $immediate = false){ public function putPacket(Player $player, DataPacket $packet, $needACK = false, $immediate = false){
if(isset($this->identifiers[$player])){ if(isset($this->identifiers[$player])){
$identifier = $this->identifiers[$player]; $identifier = $this->identifiers[$player];
$packet->encode(); if(!$packet->isEncoded){
$packet->encode();
}
$pk = new EncapsulatedPacket(); $pk = new EncapsulatedPacket();
$pk->buffer = $packet->buffer; $pk->buffer = $packet->buffer;
$pk->reliability = 2; $pk->reliability = 2;

View File

@ -27,6 +27,7 @@ use pocketmine\utils\Binary;
abstract class DataPacket extends \stdClass{ abstract class DataPacket extends \stdClass{
private $offset = 0; private $offset = 0;
public $buffer = ""; public $buffer = "";
public $isEncoded = false;
abstract public function pid(); abstract public function pid();