/**
  * Get the stage this packet is for
  * @return Stage
  */
 public function getStage()
 {
     return Stage::STATUS();
 }
 /**
  * Parse the raw data
  * @param $data String the raw data to parse (minus packet ID and packet length
  * @throws InvalidDataException
  */
 function fromRawData($data)
 {
     $versionVarInt = VarInt::readUnsignedVarInt($data);
     $data = substr($data, $versionVarInt->getDataLength());
     $addressStringLength = VarInt::readUnsignedVarInt($data);
     $data = substr($data, $addressStringLength->getDataLength());
     $address = substr($data, 0, $addressStringLength->getValue());
     $data = substr($data, $addressStringLength->getValue());
     $portShort = unpack('nshort', substr($data, 0, 2))['short'];
     $data = substr($data, 2);
     $nextVarInt = VarInt::readUnsignedVarInt($data);
     try {
         $nextStage = Stage::get($nextVarInt->getValue());
         //disconnect if not a valid stage
         if ($nextStage != Stage::LOGIN() && $nextStage != Stage::STATUS()) {
             throw new InvalidDataException('Stage must be LOGIN or STATUS on handshake');
         }
         //set all of the data
         $this->setNextStage($nextStage)->setServerPort($portShort)->setProtocolVersion($versionVarInt->getValue())->setServerAddress($address);
     } catch (InvalidArgumentException $ex) {
         throw new InvalidDataException('Stage is not a valid number');
     }
 }