From aeeee5eb5321c604f751721af19d634c4a5b564e Mon Sep 17 00:00:00 2001 From: Ivan Date: Mon, 14 Oct 2019 17:14:42 +0700 Subject: [PATCH] Added encode/decode for StructureTemplateDataExport(Request|Response)Packet (#3145) --- .../network/mcpe/NetworkBinaryStream.php | 37 +++++++++++++ ...ructureTemplateDataExportRequestPacket.php | 27 ++++++++- ...uctureTemplateDataExportResponsePacket.php | 16 +++++- .../mcpe/protocol/types/StructureSettings.php | 55 +++++++++++++++++++ 4 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 src/pocketmine/network/mcpe/protocol/types/StructureSettings.php diff --git a/src/pocketmine/network/mcpe/NetworkBinaryStream.php b/src/pocketmine/network/mcpe/NetworkBinaryStream.php index eb2456703..ba48a129b 100644 --- a/src/pocketmine/network/mcpe/NetworkBinaryStream.php +++ b/src/pocketmine/network/mcpe/NetworkBinaryStream.php @@ -37,6 +37,7 @@ use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\IntTag; use pocketmine\network\mcpe\protocol\types\CommandOriginData; use pocketmine\network\mcpe\protocol\types\EntityLink; +use pocketmine\network\mcpe\protocol\types\StructureSettings; use pocketmine\utils\BinaryStream; use pocketmine\utils\UUID; use function count; @@ -592,4 +593,40 @@ class NetworkBinaryStream extends BinaryStream{ $this->putVarLong($data->varlong1); } } + + protected function getStructureSettings() : StructureSettings{ + $result = new StructureSettings(); + + $result->paletteName = $this->getString(); + + $result->ignoreEntities = $this->getBool(); + $result->ignoreBlocks = $this->getBool(); + + $this->getBlockPosition($result->structureSizeX, $result->structureSizeY, $result->structureSizeZ); + $this->getBlockPosition($result->structureOffsetX, $result->structureOffsetY, $result->structureOffsetZ); + + $result->lastTouchedByPlayerID = $this->getEntityUniqueId(); + $result->rotation = $this->getByte(); + $result->mirror = $this->getByte(); + $result->integrityValue = $this->getFloat(); + $result->integritySeed = $this->getInt(); + + return $result; + } + + protected function putStructureSettings(StructureSettings $structureSettings) : void{ + $this->putString($structureSettings->paletteName); + + $this->putBool($structureSettings->ignoreEntities); + $this->putBool($structureSettings->ignoreBlocks); + + $this->putBlockPosition($structureSettings->structureSizeX, $structureSettings->structureSizeY, $structureSettings->structureSizeZ); + $this->putBlockPosition($structureSettings->structureOffsetX, $structureSettings->structureOffsetY, $structureSettings->structureOffsetZ); + + $this->putEntityUniqueId($structureSettings->lastTouchedByPlayerID); + $this->putByte($structureSettings->rotation); + $this->putByte($structureSettings->mirror); + $this->putFloat($structureSettings->integrityValue); + $this->putInt($structureSettings->integritySeed); + } } diff --git a/src/pocketmine/network/mcpe/protocol/StructureTemplateDataExportRequestPacket.php b/src/pocketmine/network/mcpe/protocol/StructureTemplateDataExportRequestPacket.php index b1cebc172..6ae16cec4 100644 --- a/src/pocketmine/network/mcpe/protocol/StructureTemplateDataExportRequestPacket.php +++ b/src/pocketmine/network/mcpe/protocol/StructureTemplateDataExportRequestPacket.php @@ -26,16 +26,39 @@ namespace pocketmine\network\mcpe\protocol; #include use pocketmine\network\mcpe\NetworkSession; +use pocketmine\network\mcpe\protocol\types\StructureSettings; class StructureTemplateDataExportRequestPacket extends DataPacket{ public const NETWORK_ID = ProtocolInfo::STRUCTURE_TEMPLATE_DATA_EXPORT_REQUEST_PACKET; + public const TYPE_ALWAYS_LOAD = 1; + public const TYPE_CREATE_AND_LOAD = 2; + + /** @var string */ + public $structureTemplateName; + /** @var int */ + public $structureBlockX; + /** @var int */ + public $structureBlockY; + /** @var int */ + public $structureBlockZ; + /** @var StructureSettings */ + public $structureSettings; + /** @var int */ + public $structureTemplateResponseType; + protected function decodePayload() : void{ - //TODO + $this->structureTemplateName = $this->getString(); + $this->getBlockPosition($this->structureBlockX, $this->structureBlockY, $this->structureBlockZ); + $this->structureSettings = $this->getStructureSettings(); + $this->structureTemplateResponseType = $this->getByte(); } protected function encodePayload() : void{ - //TODO + $this->putString($this->structureTemplateName); + $this->putBlockPosition($this->structureBlockX, $this->structureBlockY, $this->structureBlockZ); + $this->putStructureSettings($this->structureSettings); + $this->putByte($this->structureTemplateResponseType); } public function handle(NetworkSession $handler) : bool{ diff --git a/src/pocketmine/network/mcpe/protocol/StructureTemplateDataExportResponsePacket.php b/src/pocketmine/network/mcpe/protocol/StructureTemplateDataExportResponsePacket.php index b3878fd64..2ff52b116 100644 --- a/src/pocketmine/network/mcpe/protocol/StructureTemplateDataExportResponsePacket.php +++ b/src/pocketmine/network/mcpe/protocol/StructureTemplateDataExportResponsePacket.php @@ -30,12 +30,24 @@ use pocketmine\network\mcpe\NetworkSession; class StructureTemplateDataExportResponsePacket extends DataPacket{ public const NETWORK_ID = ProtocolInfo::STRUCTURE_TEMPLATE_DATA_EXPORT_RESPONSE_PACKET; + /** @var string */ + public $structureTemplateName; + /** @var string|null */ + public $namedtag; + protected function decodePayload() : void{ - //TODO + $this->structureTemplateName = $this->getString(); + if($this->getBool()){ + $this->namedtag = $this->getRemaining(); + } } protected function encodePayload() : void{ - //TODO + $this->putString($this->structureTemplateName); + $this->putBool($this->namedtag !== null); + if($this->namedtag !== null){ + $this->put($this->namedtag); + } } public function handle(NetworkSession $handler) : bool{ diff --git a/src/pocketmine/network/mcpe/protocol/types/StructureSettings.php b/src/pocketmine/network/mcpe/protocol/types/StructureSettings.php new file mode 100644 index 000000000..465e643cc --- /dev/null +++ b/src/pocketmine/network/mcpe/protocol/types/StructureSettings.php @@ -0,0 +1,55 @@ +