DataPacket events now use network sessions instead of players

This commit is contained in:
Dylan K. Taylor 2019-03-23 09:52:03 +00:00
parent afbd016611
commit 433dab078b
5 changed files with 47 additions and 46 deletions

View File

@ -1479,22 +1479,23 @@ class Server{
throw new \InvalidArgumentException("Cannot broadcast empty list of packets"); throw new \InvalidArgumentException("Cannot broadcast empty list of packets");
} }
$ev = new DataPacketBroadcastEvent($players, $packets); /** @var NetworkSession[] $recipients */
$recipients = [];
foreach($players as $player){
if($player->isConnected()){
$recipients[] = $player->getNetworkSession();
}
}
if(empty($recipients)){
return false;
}
$ev = new DataPacketBroadcastEvent($recipients, $packets);
$ev->call(); $ev->call();
if($ev->isCancelled()){ if($ev->isCancelled()){
return false; return false;
} }
$recipients = $ev->getTargets();
/** @var NetworkSession[] $targets */
$targets = [];
foreach($ev->getPlayers() as $player){
if($player->isConnected()){
$targets[] = $player->getNetworkSession();
}
}
if(empty($targets)){
return false;
}
$stream = new PacketStream(); $stream = new PacketStream();
foreach($ev->getPackets() as $packet){ foreach($ev->getPackets() as $packet){
@ -1502,14 +1503,14 @@ class Server{
} }
if(NetworkCompression::$THRESHOLD < 0 or strlen($stream->getBuffer()) < NetworkCompression::$THRESHOLD){ if(NetworkCompression::$THRESHOLD < 0 or strlen($stream->getBuffer()) < NetworkCompression::$THRESHOLD){
foreach($targets as $target){ foreach($recipients as $target){
foreach($ev->getPackets() as $pk){ foreach($ev->getPackets() as $pk){
$target->addToSendBuffer($pk); $target->addToSendBuffer($pk);
} }
} }
}else{ }else{
$promise = $this->prepareBatch($stream); $promise = $this->prepareBatch($stream);
foreach($targets as $target){ foreach($recipients as $target){
$target->queueCompressed($promise); $target->queueCompressed($promise);
} }
} }

View File

@ -25,8 +25,8 @@ namespace pocketmine\event\server;
use pocketmine\event\Cancellable; use pocketmine\event\Cancellable;
use pocketmine\event\CancellableTrait; use pocketmine\event\CancellableTrait;
use pocketmine\network\mcpe\NetworkSession;
use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ClientboundPacket;
use pocketmine\Player;
/** /**
* Called when a list of packets is broadcasted to 1 or more players. * Called when a list of packets is broadcasted to 1 or more players.
@ -34,32 +34,32 @@ use pocketmine\Player;
class DataPacketBroadcastEvent extends ServerEvent implements Cancellable{ class DataPacketBroadcastEvent extends ServerEvent implements Cancellable{
use CancellableTrait; use CancellableTrait;
/** @var Player[] */ /** @var NetworkSession[] */
private $players; private $targets;
/** @var ClientboundPacket[] */ /** @var ClientboundPacket[] */
private $packets; private $packets;
/** /**
* @param Player[] $players * @param NetworkSession[] $targets
* @param ClientboundPacket[] $packets * @param ClientboundPacket[] $packets
*/ */
public function __construct(array $players, array $packets){ public function __construct(array $targets, array $packets){
$this->players = $players; $this->targets = $targets;
$this->packets = $packets; $this->packets = $packets;
} }
/** /**
* @return Player[] * @return NetworkSession[]
*/ */
public function getPlayers() : array{ public function getTargets() : array{
return $this->players; return $this->targets;
} }
/** /**
* @param Player[] $players * @param NetworkSession[] $targets
*/ */
public function setPlayers(array $players) : void{ public function setTargets(array $targets) : void{
$this->players = $players; $this->targets = $targets;
} }
/** /**

View File

@ -25,24 +25,24 @@ namespace pocketmine\event\server;
use pocketmine\event\Cancellable; use pocketmine\event\Cancellable;
use pocketmine\event\CancellableTrait; use pocketmine\event\CancellableTrait;
use pocketmine\network\mcpe\NetworkSession;
use pocketmine\network\mcpe\protocol\ServerboundPacket; use pocketmine\network\mcpe\protocol\ServerboundPacket;
use pocketmine\Player;
class DataPacketReceiveEvent extends ServerEvent implements Cancellable{ class DataPacketReceiveEvent extends ServerEvent implements Cancellable{
use CancellableTrait; use CancellableTrait;
/** @var ServerboundPacket */ /** @var ServerboundPacket */
private $packet; private $packet;
/** @var Player */ /** @var NetworkSession */
private $player; private $origin;
/** /**
* @param Player $player * @param NetworkSession $origin
* @param ServerboundPacket $packet * @param ServerboundPacket $packet
*/ */
public function __construct(Player $player, ServerboundPacket $packet){ public function __construct(NetworkSession $origin, ServerboundPacket $packet){
$this->packet = $packet; $this->packet = $packet;
$this->player = $player; $this->origin = $origin;
} }
/** /**
@ -53,9 +53,9 @@ class DataPacketReceiveEvent extends ServerEvent implements Cancellable{
} }
/** /**
* @return Player * @return NetworkSession
*/ */
public function getPlayer() : Player{ public function getOrigin() : NetworkSession{
return $this->player; return $this->origin;
} }
} }

View File

@ -25,24 +25,24 @@ namespace pocketmine\event\server;
use pocketmine\event\Cancellable; use pocketmine\event\Cancellable;
use pocketmine\event\CancellableTrait; use pocketmine\event\CancellableTrait;
use pocketmine\network\mcpe\NetworkSession;
use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ClientboundPacket;
use pocketmine\Player;
class DataPacketSendEvent extends ServerEvent implements Cancellable{ class DataPacketSendEvent extends ServerEvent implements Cancellable{
use CancellableTrait; use CancellableTrait;
/** @var ClientboundPacket */ /** @var ClientboundPacket */
private $packet; private $packet;
/** @var Player */ /** @var NetworkSession */
private $player; private $target;
/** /**
* @param Player $player * @param NetworkSession $target
* @param ClientboundPacket $packet * @param ClientboundPacket $packet
*/ */
public function __construct(Player $player, ClientboundPacket $packet){ public function __construct(NetworkSession $target, ClientboundPacket $packet){
$this->packet = $packet; $this->packet = $packet;
$this->player = $player; $this->target = $target;
} }
/** /**
@ -53,9 +53,9 @@ class DataPacketSendEvent extends ServerEvent implements Cancellable{
} }
/** /**
* @return Player * @return NetworkSession
*/ */
public function getPlayer() : Player{ public function getTarget() : NetworkSession{
return $this->player; return $this->target;
} }
} }

View File

@ -268,7 +268,7 @@ class NetworkSession{
$this->server->getLogger()->debug("Still " . strlen($remains) . " bytes unread in " . $packet->getName() . ": " . bin2hex($remains)); $this->server->getLogger()->debug("Still " . strlen($remains) . " bytes unread in " . $packet->getName() . ": " . bin2hex($remains));
} }
$ev = new DataPacketReceiveEvent($this->player, $packet); $ev = new DataPacketReceiveEvent($this, $packet);
$ev->call(); $ev->call();
if(!$ev->isCancelled() and !$packet->handle($this->handler)){ if(!$ev->isCancelled() and !$packet->handle($this->handler)){
$this->server->getLogger()->debug("Unhandled " . $packet->getName() . " received from " . $this->getDisplayName() . ": " . bin2hex($packet->getBuffer())); $this->server->getLogger()->debug("Unhandled " . $packet->getName() . " received from " . $this->getDisplayName() . ": " . bin2hex($packet->getBuffer()));
@ -287,7 +287,7 @@ class NetworkSession{
$timings = Timings::getSendDataPacketTimings($packet); $timings = Timings::getSendDataPacketTimings($packet);
$timings->startTiming(); $timings->startTiming();
try{ try{
$ev = new DataPacketSendEvent($this->player, $packet); $ev = new DataPacketSendEvent($this, $packet);
$ev->call(); $ev->call();
if($ev->isCancelled()){ if($ev->isCancelled()){
return false; return false;