use pocketmine\network\mcpe\handler\SessionHandler; use pocketmine\resourcepacks\ResourcePack; use function count; class ResourcePacksInfoPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::RESOURCE_PACKS_INFO_PACKET; /** @var bool */ public $mustAccept = false; //if true, forces client to use selected resource packs /** @var bool */ public $hasScripts = false; //if true, causes disconnect for any platform that doesn't support scripts yet /** @var ResourcePack[] */ public $behaviorPackEntries = []; /** @var ResourcePack[] */ public $resourcePackEntries = []; /** * @param ResourcePack[] $resourcePacks * @param ResourcePack[] $behaviorPacks * @param bool $mustAccept * @param bool $hasScripts * * @return ResourcePacksInfoPacket */ public static function create(array $resourcePacks, array $behaviorPacks, bool $mustAccept, bool $hasScripts = false) : self{ $result = new self; $result->mustAccept = $mustAccept; $result->hasScripts = $hasScripts; $result->resourcePackEntries = $resourcePacks; $result->behaviorPackEntries = $behaviorPacks; return $result; } protected function decodePayload() : void{ $this->mustAccept = $this->getBool(); $this->hasScripts = $this->getBool(); $behaviorPackCount = $this->getLShort(); while($behaviorPackCount-- > 0){ $this->getString(); $this->getString(); $this->getLLong(); $this->getString(); $this->getString(); $this->getString(); $this->getBool(); } $resourcePackCount = $this->getLShort(); while($resourcePackCount-- > 0){ $this->getString(); $this->getString(); $this->getLLong(); $this->getString(); $this->getString(); $this->getString(); $this->getBool(); } } protected function encodePayload() : void{ $this->putBool($this->mustAccept); $this->putBool($this->hasScripts); $this->putLShort(count($this->behaviorPackEntries)); foreach($this->behaviorPackEntries as $entry){ $this->putString($entry->getPackId()); $this->putString($entry->getPackVersion()); $this->putLLong($entry->getPackSize()); $this->putString(""); //TODO: encryption key $this->putString(""); //TODO: subpack name $this->putString(""); //TODO: content identity $this->putBool(false); //TODO: has scripts (?) } $this->putLShort(count($this->resourcePackEntries)); foreach($this->resourcePackEntries as $entry){ $this->putString($entry->getPackId()); $this->putString($entry->getPackVersion()); $this->putLLong($entry->getPackSize()); $this->putString(""); //TODO: encryption key $this->putString(""); //TODO: subpack name $this->putString(""); //TODO: content identity $this->putBool(false); //TODO: seems useless for resource packs } } public function handle(SessionHandler $handler) : bool{ return $handler->handleResourcePacksInfo($this); } }