@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);
      }
    }
    @Override
    public void fromBytes(ByteBuf buffer) {
      packetType = PortableTeleporterPacketType.values()[buffer.readInt()];

      if (packetType == PortableTeleporterPacketType.DATA_REQUEST) {
        if (buffer.readBoolean()) {
          frequency =
              new Frequency(PacketHandler.readString(buffer), null).setPublic(buffer.readBoolean());
        }
      } else if (packetType == PortableTeleporterPacketType.DATA_RESPONSE) {
        if (buffer.readBoolean()) {
          frequency =
              new Frequency(PacketHandler.readString(buffer), null).setPublic(buffer.readBoolean());
        }

        status = buffer.readByte();

        int amount = buffer.readInt();

        for (int i = 0; i < amount; i++) {
          publicCache.add(new Frequency(buffer));
        }

        amount = buffer.readInt();

        for (int i = 0; i < amount; i++) {
          privateCache.add(new Frequency(buffer));
        }
      } else if (packetType == PortableTeleporterPacketType.SET_FREQ) {
        frequency =
            new Frequency(PacketHandler.readString(buffer), null).setPublic(buffer.readBoolean());
      } else if (packetType == PortableTeleporterPacketType.DEL_FREQ) {
        frequency =
            new Frequency(PacketHandler.readString(buffer), null).setPublic(buffer.readBoolean());
      } else if (packetType == PortableTeleporterPacketType.TELEPORT) {
        frequency =
            new Frequency(PacketHandler.readString(buffer), null).setPublic(buffer.readBoolean());
      }
    }