mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-04-21 08:17:34 +00:00
Improved broadcast packet encoding
This commit is contained in:
parent
9cb27e26ef
commit
94e9485be9
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user