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);