@Override
 public String getServer(ProxiedPlayer player) {
   ListenerInfo listener = player.getPendingConnection().getListener();
   if (listener.isForceDefault()) {
     return listener.getDefaultServer();
   }
   String forced =
       listener.getForcedHosts().get(player.getPendingConnection().getVirtualHost().getHostName());
   String server = (forced == null) ? data.get(key(player)) : forced;
   return (server != null) ? server : listener.getDefaultServer();
 }
Example #2
0
  @Override
  protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception {
    ByteBuf in = msg.content();
    if (in.readUnsignedByte() != 0xFE || in.readUnsignedByte() != 0xFD) {
      bungee.getLogger().log(Level.WARNING, "Query - Incorrect magic!: {0}", msg.sender());
      return;
    }

    ByteBuf out = ctx.alloc().buffer();
    AddressedEnvelope response = new DatagramPacket(out, msg.sender());

    byte type = in.readByte();
    int sessionId = in.readInt();

    if (type == 0x09) {
      out.writeByte(0x09);
      out.writeInt(sessionId);

      int challengeToken = random.nextInt();
      sessions.put(challengeToken, System.currentTimeMillis());

      writeNumber(out, challengeToken);
    }

    if (type == 0x00) {
      int challengeToken = in.readInt();
      Long session = sessions.get(challengeToken);
      if (session == null || System.currentTimeMillis() - session > TimeUnit.SECONDS.toMillis(30)) {
        throw new IllegalStateException("No session!");
      }

      out.writeByte(0x00);
      out.writeInt(sessionId);

      if (in.readableBytes() == 0) {
        // Short response
        writeString(out, listener.getMotd()); // MOTD
        writeString(out, "SMP"); // Game Type
        writeString(out, "BungeeCord_Proxy"); // World Name
        writeNumber(out, bungee.getOnlineCount()); // Online Count
        writeNumber(out, listener.getMaxPlayers()); // Max Players
        writeShort(out, listener.getHost().getPort()); // Port
        writeString(out, listener.getHost().getHostString()); // IP
      } else if (in.readableBytes() == 4) {
        // Long Response
        out.writeBytes(
            new byte[] {0x73, 0x70, 0x6C, 0x69, 0x74, 0x6E, 0x75, 0x6D, 0x00, (byte) 0x80, 0x00});
        Map<String, String> data = new LinkedHashMap<>();

        data.put("hostname", listener.getMotd());
        data.put("gametype", "SMP");
        // Start Extra Info
        data.put("game_id", "MINECRAFT");
        data.put("version", bungee.getGameVersion());
        data.put("plugins", "");
        // End Extra Info
        data.put("map", "BungeeCord");
        // data.put( "numplayers", Integer.toString( bungee.getOnlineCount() ) );
        data.put("numplayers", Integer.toString(getFakePlayerNumber()));
        data.put("maxplayers", Integer.toString(listener.getMaxPlayers()));
        data.put("hostport", Integer.toString(listener.getHost().getPort()));
        data.put("hostip", listener.getHost().getHostString());

        for (Map.Entry<String, String> entry : data.entrySet()) {
          writeString(out, entry.getKey());
          writeString(out, entry.getValue());
        }
        out.writeByte(0x00); // Null

        // Padding
        writeString(out, "\01player_\00");
        // Player List
        for (ProxiedPlayer p : bungee.getPlayers()) {
          writeString(out, p.getName());
        }
        // writeString( out, "Mr_ludek" );
        // for(int x = 0; x < getFakePlayerNumber(); x++){

        // }
        writePlayers(getFakePlayerNumber(), out);

        out.writeByte(0x00); // Null
      } else {
        // Error!
        throw new IllegalStateException("Invalid data request packet");
      }
    }

    ctx.writeAndFlush(response);
  }