use pocketmine\math\Vector3; use pocketmine\network\mcpe\handler\SessionHandler; use function count; class ExplodePacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::EXPLODE_PACKET; /** @var Vector3 */ public $position; /** @var float */ public $radius; /** @var Vector3[] */ public $records = []; /** * @param Vector3 $center * @param float $radius * @param Vector3[] $records * * @return ExplodePacket */ public static function create(Vector3 $center, float $radius, array $records) : self{ (function(Vector3 ...$_){})(...$records); $result = new self; $result->position = $center; $result->radius = $radius; $result->records = $records; return $result; } protected function decodePayload() : void{ $this->position = $this->getVector3(); $this->radius = (float) ($this->getVarInt() / 32); $count = $this->getUnsignedVarInt(); for($i = 0; $i < $count; ++$i){ $x = $y = $z = null; $this->getSignedBlockPosition($x, $y, $z); $this->records[$i] = new Vector3($x, $y, $z); } } protected function encodePayload() : void{ $this->putVector3($this->position); $this->putVarInt((int) ($this->radius * 32)); $this->putUnsignedVarInt(count($this->records)); if(count($this->records) > 0){ foreach($this->records as $record){ $this->putSignedBlockPosition((int) $record->x, (int) $record->y, (int) $record->z); } } } public function handle(SessionHandler $handler) : bool{ return $handler->handleExplode($this); } }