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->bodyYaw = $this->yaw;
foreach($this->hasSpawned as $player){
$player->dataPacket($pk);
}
Server::broadcastPacket($this->hasSpawned, $pk);
}
}
}

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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);
}
}
}

View File

@ -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);

View File

@ -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;

View File

@ -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();