public function decode()
 {
     parent::decode();
     $this->splitpackets = [];
     $this->packets = [];
     $this->seqNumber = $this->getLTriad();
     while (!$this->feof()) {
         $offset = 0;
         $data = substr($this->buffer, $this->offset);
         $packet = EncapsulatedPacket::fromBinary($data, false, $offset);
         $this->offset += $offset;
         if (strlen($packet->buffer) === 0) {
             break;
         }
         if ($packet->hasSplit) {
             $this->splitpackets[] = $packet;
         } else {
             $this->packets[] = $packet;
         }
     }
 }
 public function ReceivePacket($callname, $buffer)
 {
     $id = ord($buffer[0]);
     switch ($id) {
         case 1:
             $packet = new UnconnectedPingPacket($buffer);
             break;
         case 5:
             $packet = new OpenConnectionRequest1Packet($buffer);
             break;
         case 6:
             $packet = new OpenConnectionReply1Packet($buffer);
             break;
         case 7:
             $packet = new OpenConnectionRequest2Packet($buffer);
             break;
         case 8:
             $packet = new OpenConnectionReply2Packet($buffer);
             break;
         case 28:
             $packet = new UnconnectedPongPacket($buffer);
             break;
         case 128:
         case 129:
         case 130:
         case 131:
         case 132:
         case 133:
         case 134:
         case 135:
         case 136:
         case 137:
         case 138:
         case 139:
         case 140:
         case 141:
         case 142:
         case 143:
             $packet = new CustomPacket($buffer);
             $packet->decode();
             foreach ($packet->packets as $num => $enpacket) {
                 $enpacket = EncapsulatedPacket::fromBinary($enpacket->toBinary(true), true);
                 $this->datapacketanlyze->ReceiveDataPacket($enpacket->buffer, $callname, $this->status);
             }
             foreach ($packet->splitpackets as $num => $splitpacket) {
                 if ($splitpacket->splitCount >= 128) {
                     return;
                 }
                 if (!isset($this->splitPackets[$splitpacket->splitID])) {
                     $this->splitPackets[$splitpacket->splitID] = [$splitpacket->splitIndex => $splitpacket];
                 } else {
                     $this->splitPackets[$splitpacket->splitID][$splitpacket->splitIndex] = $splitpacket;
                 }
                 if (count($this->splitPackets[$splitpacket->splitID]) === $splitpacket->splitCount) {
                     $pk = new EncapsulatedPacket();
                     $pk->buffer = "";
                     for ($i = 0; $i < $splitpacket->splitCount; ++$i) {
                         if (isset($this->splitPackets[$splitpacket->splitID][$i])) {
                             $pk->buffer .= $this->splitPackets[$splitpacket->splitID][$i]->buffer;
                         } else {
                             $this->logger->debug("[Encapsulated] " . $splitpacket->splitID . " : " . $i . "", 1);
                         }
                     }
                     $pk->length = strlen($pk->buffer);
                     unset($this->splitPackets[$splitpacket->splitID]);
                     $this->datapacketanlyze->ReceiveDataPacket($pk->buffer, $callname, $this->status);
                 }
             }
             break;
         case 160:
             $packet = new NACK($buffer);
             break;
         case 192:
             $packet = new ACK($buffer);
             break;
         default:
             $packet = new UnknownPacket($buffer);
             break;
     }
     $this->logger->debug("RakPacket (" . $callname . "): " . $id . " (0x" . bin2hex(chr($id)) . ") : " . $packet->getName(), 2);
     if (!$packet->decoded) {
         $packet->decode();
     }
     $packet->check();
     unset($packet);
 }