@Override
    public void toBytes(ByteBuf buffer) {
      buffer.writeInt(packetType.ordinal());

      if (packetType == PortableTeleporterPacketType.DATA_REQUEST) {
        if (frequency != null) {
          buffer.writeBoolean(true);
          PacketHandler.writeString(buffer, frequency.name);
          buffer.writeBoolean(frequency.publicFreq);
        } else {
          buffer.writeBoolean(false);
        }
      } else if (packetType == PortableTeleporterPacketType.DATA_RESPONSE) {
        if (frequency != null) {
          buffer.writeBoolean(true);
          PacketHandler.writeString(buffer, frequency.name);
          buffer.writeBoolean(frequency.publicFreq);
        } else {
          buffer.writeBoolean(false);
        }

        buffer.writeByte(status);

        ArrayList data = new ArrayList();
        data.add(publicCache.size());

        for (Frequency freq : publicCache) {
          freq.write(data);
        }

        data.add(privateCache.size());

        for (Frequency freq : privateCache) {
          freq.write(data);
        }

        PacketHandler.encode(data.toArray(), buffer);
      } else if (packetType == PortableTeleporterPacketType.SET_FREQ) {
        PacketHandler.writeString(buffer, frequency.name);
        buffer.writeBoolean(frequency.publicFreq);
      } else if (packetType == PortableTeleporterPacketType.DEL_FREQ) {
        PacketHandler.writeString(buffer, frequency.name);
        buffer.writeBoolean(frequency.publicFreq);
      } else if (packetType == PortableTeleporterPacketType.TELEPORT) {
        PacketHandler.writeString(buffer, frequency.name);
        buffer.writeBoolean(frequency.publicFreq);
      }
    }