Minecraft Query

  • Hallo Leute,


    ich wollte ein wenig mit Java Spielen und möchte gerne die SpielerListe + Namen eines Servers auslesen.


    Am Anfang habe ich eine Packet ID an den Server geschickt und habe dafür MOTD, Spieler und MaxSpieler auslesen können (http://www.wiki.vg/Protocol#Server_List_Ping_.280xFE.29)


    Nun habe ich mein Ziel aber nicht erreicht und habe weiter gesucht. Nach einiger Zeit habe ich dann diese Seite gefunden: http://www.wiki.vg/Query


    Nachdem ich mich ein wenig informiert habe habe ich es zustande bekommen einen Token mittels des Handshakes als Paket zu empfangen. Danach wollte ich die BasicStats auslesen und dafür benötige ich den Token. Nur weiß ich nicht ganz wie das ganze aussehen muss. Das Paket muss ca. so aussehen: FE FD 00 00 00 00 01 00 91 29 5B

    Wobei vier der Bytes durch den Token ersetzt werden müssen...




    Nach erfolglosen probieren wende ich mich nun an euch. Ich habe mir den Beispielcode angeschaut und mein jetziger Code sieht so aus:



    Nach einigen versuchen habe ich dann ein Stück von dem Beispielcode kopiert: https://github.com/ryanshawty/…ryanshaw/Query/Query.java
    Doch leider verstehe ich den nicht ganz. :X

  • Du hast bei dem MC Query-Zeugs, so wie ich das sehe, drei Schritte.


    1.

    Code
    1. sendPacket(socket, address, 0xFE, 0xFD, 0x09, 0x01, 0x01, 0x01, 0x01);


    2.



    3.


    Code
    1. sendPacket(socket, address, 0xFE, 0xFD, 0x00, 0x01, 0x01, 0x01, 0x01, challengeInteger >> 24, challengeInteger >> 16, challengeInteger >> 8, challengeInteger, 0x00, 0x00, 0x00, 0x00);


    Beim zweiten Schritt besorgst du dir dann einfach den "challengeInteger".

  • Habe ich es nicht genau so gemacht? Das ist ja eig. der Code den ich übernommen habe. Was ich auch nicht ganz verstehe ist, dass mein Handshake nur eine Nummer hat. Normalerweise müsste dort ja noch eine ID stehen.


    Token: 3463115
    Token: 2867369
    Token: 4984753


    type Exception report
    message
    descriptionThe server encountered an internal error () that prevented it from fulfilling this request.
    exception
    java.net.SocketTimeoutException: Receive timed out
    note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.1 logs.


    Er nimmt den Token ja nicht an also muss etwas falsch laufen. :/
    Ohne einen Time out würde der ewig auf eine Antwort warten.

  • Mit Token meine ich die Bytes 6-9 die ich vom Handshake bekomme und die ich für weitere Pakete benötige.


    EDIT:


    http://dinnerbone.com/blog/201…ft-19-has-rcon-and-query/


    Sogesehn muss ich doch nur die letzten Bytes in meinem nächsten Paket mitschicken d.H:


    s_message[0] = (byte) 0xFE;
    s_message[1] = (byte) 0xFD;
    s_message[2] = (byte) 0x00;
    s_message[3] = (byte) 0x01;
    s_message[4] = (byte) 0x01;
    s_message[4] = (byte) 0x01;
    s_message[5] = (byte) 0x01;
    s_message[6] = h_recv[5];
    s_message[7] = h_recv[6];
    s_message[8] = h_recv[7];
    s_message[9] = h_recv[8];


    oder sehe ich das falsch?

  • Zitat

    In this example, after parsing the string "9513307\0" as an integer and
    packing it as a big endian int32, the result should be 00 91 29 5B

    Das sollte dir helfen. Du musst den Integer in big endian int32 konvertieren, wenn du das Token in hexadezimaler Form haben möchtest.
    Ändert aber nichts am Wert des Tokens.


    E: Nee, das geht nicht ganz so einfach. Du musst die bytes erst in einen String wandeln und den String dann in einen Integer.


    Code
    1. 09 00 00 00 01 39 35 31 33 33 30 37 00 | .....9513307.


    Hab das mal eben schnell in C# nachgecoded. Klappt einwandfrei. Wenn du noch Hilfe brauchst, dann regeln wir das am besten über TeamViewer, falls deine Leitung gut genug ist :)