1. The forums will be archived and moved to a read only mode in about 2 weeks (mid march).

Solved behaviorPack send and enable

Discussion in 'Development' started by DaisukeDaisuke, Sep 28, 2019.

  1. DaisukeDaisuke

    DaisukeDaisuke Creeper

    Messages:
    2
    GitHub:
    DaisukeDaisuke
    (I use google translate.)

    Hello.

    I created code to send a behaviorPack, but right after sending the ResourcePackStackPacket, the message "Encountered a problem while downloading or applying resource pack." How can I send a behaviorPack?

    PHP:
    use pocketmine\resourcepacks\ResourcePack;
    use 
    pocketmine\resourcepacks\ResourcePackManager;

    use 
    pocketmine\network\mcpe\protocol\types\ResourcePackType;
    use 
    pocketmine\network\mcpe\protocol\ResourcePackClientResponsePacket;
    use 
    pocketmine\network\mcpe\protocol\ResourcePackChunkRequestPacket;
    use 
    pocketmine\network\mcpe\protocol\ResourcePackChunkDataPacket;
    use 
    pocketmine\network\mcpe\protocol\ResourcePackDataInfoPacket;
    use 
    pocketmine\network\mcpe\protocol\ResourcePacksInfoPacket;
    use 
    pocketmine\network\mcpe\protocol\ResourcePackStackPacket;
    PHP:
        /** @var ResourcePackManager */
        
    public $ResourcePackManager null;//behaviorPack
        /** @var bool */
        
    public $IsExperimentalGamePlay false;

        public function 
    onEnable(){
            
    $this->getServer()->getPluginManager()->registerEvents($this$this);
            if(!
    file_exists($this->getDataFolder())){
                
    mkdir($this->getDataFolder(),0774,true);
            }
            
    $this->saveResource("resource_packs.yml");
            
    $this->ResourcePackManager = new ResourcePackManager($this->getDataFolder(),$this->getLogger());
            
    $resourcePacksConfig = new Config($this->getDataFolder() . "resource_packs.yml"Config::YAML, []);
            
    $this->IsExperimentalGamePlay = (bool) $resourcePacksConfig->get("ExperimentalGamePlay");
        }

        public function 
    send(DataPacketSendEvent $event){
            if(
    $event->getPacket() instanceof ResourcePackStackPacket){
                
    $event->getPacket()->isExperimental $this->IsExperimentalGamePlay;
                
    $event->getPacket()->behaviorPackStack $this->ResourcePackManager->getResourceStack();
            }else if(
    $event->getPacket() instanceof ResourcePacksInfoPacket){
                
    $event->getPacket()->behaviorPackEntries $this->ResourcePackManager->getResourceStack();
                
    $event->getPacket()->hasScripts true;
            }
        }

        public function 
    Receive(DataPacketReceiveEvent $event){
            if(
    $event->getPacket() instanceof ResourcePackClientResponsePacket){
                
    $packet $event->getPacket();
                
    var_dump($packet->packIds,$this->ResourcePackManager->getPackIdList());
                switch(
    $packet->status){
                    case 
    ResourcePackClientResponsePacket::STATUS_SEND_PACKS:
                        
    $manager $this->ResourcePackManager;
                        foreach(
    $packet->packIds as $key => $uuid){
                            
    //dirty hack for mojang's dirty hack for versions
                            
    $splitPos strpos($uuid"_");
                            if(
    $splitPos !== false){
                                
    $uuid substr($uuid0$splitPos);
                            }
                            
    $pack $manager->getPackById($uuid);
                            if(!(
    $pack instanceof ResourcePack)){
                                continue;
                            }
                            
    $pk = new ResourcePackDataInfoPacket();
                            
    $pk->packId $pack->getPackId();
                            
    $pk->maxChunkSize 1048576//1MB
                            
    $pk->chunkCount = (int) ceil($pack->getPackSize() / $pk->maxChunkSize);
                            
    $pk->compressedPackSize $pack->getPackSize();
                            
    $pk->sha256 $pack->getSha256();
                            
    $event->getPlayer()->dataPacket($pk);
                            unset(
    $event->getPacket()->packIds[$key]);
                        }
                    break;
                }
            }else if(
    $event->getPacket() instanceof ResourcePackChunkRequestPacket){
                
    $packet $event->getPacket();
                
    $manager $this->ResourcePackManager;
                
    $pack $manager->getPackById($packet->packId);
                if(!(
    $pack instanceof ResourcePack)){
                    return;
                }
                
    $pk = new ResourcePackChunkDataPacket();
                
    $pk->packId $pack->getPackId();
                
    $pk->chunkIndex $packet->chunkIndex;
                
    $pk->data $pack->getPackChunk(1048576 $packet->chunkIndex1048576);
                
    $pk->progress = (1048576 $packet->chunkIndex);
                
    $event->getPlayer()->dataPacket($pk);
                
    $event->setCancelled();
            }
        }
     
    Last edited: Dec 7, 2019
  2. DaisukeDaisuke

    DaisukeDaisuke Creeper

    Messages:
    2
    GitHub:
    DaisukeDaisuke
    After changing the PackType of ResourcePackDataInfoPacket to ResourcePackType::BEHAVIORS, we were able to send it!
    Thank you very much.
    https://github.com/pmmp/PocketMine-...e/protocol/ResourcePackDataInfoPacket.php#L49

    PHP:
         /** @var ResourcePackManager */
        
    public $ResourcePackManager null;//behaviorPack
        /** @var bool */
        
    public $IsExperimentalGamePlay false;

        public function 
    onEnable(){
            
    $this->getServer()->getPluginManager()->registerEvents($this$this);
            if(!
    file_exists($this->getDataFolder())){
                
    mkdir($this->getDataFolder(),0774,true);
            }
            
    $this->saveResource("resource_packs.yml");
            
    $this->ResourcePackManager = new ResourcePackManager($this->getDataFolder(),$this->getLogger());
            
    $resourcePacksConfig = new Config($this->getDataFolder() . "resource_packs.yml"Config::YAML, []);
            
    $this->IsExperimentalGamePlay = (bool) $resourcePacksConfig->get("ExperimentalGamePlay");
        }

        public function 
    send(DataPacketSendEvent $event){
            if(
    $event->getPacket() instanceof ResourcePackStackPacket){
                
    $event->getPacket()->isExperimental $this->IsExperimentalGamePlay;
                
    $event->getPacket()->behaviorPackStack $this->ResourcePackManager->getResourceStack();
            }else if(
    $event->getPacket() instanceof ResourcePacksInfoPacket){
                
    $event->getPacket()->behaviorPackEntries $this->ResourcePackManager->getResourceStack();
                
    $event->getPacket()->hasScripts true;
            }
        }

        public function 
    Receive(DataPacketReceiveEvent $event){
            if(
    $event->getPacket() instanceof ResourcePackClientResponsePacket){
                
    $packet $event->getPacket();
                
    var_dump($packet->packIds,$this->ResourcePackManager->getPackIdList());
                switch(
    $packet->status){
                    case 
    ResourcePackClientResponsePacket::STATUS_SEND_PACKS:
                        
    $manager $this->ResourcePackManager;
                        foreach(
    $packet->packIds as $key => $uuid){
                            
    //dirty hack for mojang's dirty hack for versions
                            
    $splitPos strpos($uuid"_");
                            if(
    $splitPos !== false){
                                
    $uuid substr($uuid0$splitPos);
                            }
                            
    $pack $manager->getPackById($uuid);
                            if(!(
    $pack instanceof ResourcePack)){
                                continue;
                            }
                            
    $pk = new ResourcePackDataInfoPacket();
                            
    $pk->packId $pack->getPackId();
                            
    $pk->maxChunkSize 1048576//1MB
                            
    $pk->chunkCount = (int) ceil($pack->getPackSize() / $pk->maxChunkSize);
                            
    $pk->compressedPackSize $pack->getPackSize();
                            
    $pk->sha256 $pack->getSha256();
                            
    $pk->packType ResourcePackType::BEHAVIORS;//ResourcePackType::ADDON;// ...?
                            
    $event->getPlayer()->dataPacket($pk);
                            unset(
    $event->getPacket()->packIds[$key]);
                        }
                    break;
                }
            }else if(
    $event->getPacket() instanceof ResourcePackChunkRequestPacket){
                
    $packet $event->getPacket();
                
    $manager $this->ResourcePackManager;
                
    $pack $manager->getPackById($packet->packId);
                if(!(
    $pack instanceof ResourcePack)){
                    return;
                }
                
    $pk = new ResourcePackChunkDataPacket();
                
    $pk->packId $pack->getPackId();
                
    $pk->chunkIndex $packet->chunkIndex;
                
    $pk->data $pack->getPackChunk(1048576 $packet->chunkIndex1048576);
                
    $pk->progress = (1048576 $packet->chunkIndex);
                
    $event->getPlayer()->dataPacket($pk);
                
    $event->setCancelled();
            }
        } 
     
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.