25    public const NETWORK_ID = 0;
 
   27    public const PID_MASK = 0x3ff; 
 
   29    private const SUBCLIENT_ID_MASK = 0x03; 
 
   30    private const SENDER_SUBCLIENT_ID_SHIFT = 10;
 
   31    private const RECIPIENT_SUBCLIENT_ID_SHIFT = 12;
 
   33    public int $senderSubId = 0;
 
   34    public int $recipientSubId = 0;
 
   36    public function pid() : 
int{
 
   37        return $this::NETWORK_ID;
 
   40    public function getName() : 
string{
 
   41        return (
new \ReflectionClass($this))->getShortName();
 
   44    public function canBeSentBeforeLogin() : 
bool{
 
   51    final public function decode(ByteBufferReader $in) : void{
 
   56            throw PacketDecodeException::wrap($e, $this->getName());
 
 
   65        $header = VarInt::readUnsignedInt($in);
 
   66        $pid = $header & self::PID_MASK;
 
   67        if($pid !== static::NETWORK_ID){
 
   71        $this->senderSubId = ($header >> self::SENDER_SUBCLIENT_ID_SHIFT) & self::SUBCLIENT_ID_MASK;
 
   72        $this->recipientSubId = ($header >> self::RECIPIENT_SUBCLIENT_ID_SHIFT) & self::SUBCLIENT_ID_MASK;
 
 
   84    final public function encode(ByteBufferWriter $out) : void{
 
   85        $this->encodeHeader($out);
 
   86        $this->encodePayload($out);
 
   89    protected function encodeHeader(ByteBufferWriter $out) : void{
 
   90        VarInt::writeUnsignedInt($out,
 
   92            ($this->senderSubId << self::SENDER_SUBCLIENT_ID_SHIFT) |
 
   93            ($this->recipientSubId << self::RECIPIENT_SUBCLIENT_ID_SHIFT)
 
  108        throw new \Error(
"Undefined property: " . get_class($this) . 
"::\$" . $name);
 
 
  115    public function __set($name, $value) : void{
 
  116        throw new \Error(
"Undefined property: " . get_class($this) . 
"::\$" . $name);