[Minecraft] Server / Client Protokoll?

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von SeriTools.

    [Minecraft] Server / Client Protokoll?

    Hi,

    ich würde gerne einen Minecraft-Bot programmieren und habe dazu diesen Link hier gefunden.

    Jetzt hab ich mir erstmal sowas hier gebastelt (Konsolenanwendung)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Module1
    2. Dim sock As System.Net.Sockets.Socket
    3. Dim mcserver As String = "SERVERADRESSE"
    4. Dim port As Integer = 25565
    5. Dim nick As String = "SPIELERNAME"
    6. 'The following objects are for manipulating the console IN and OUT streams
    7. Dim cout As System.IO.TextWriter = Console.Out
    8. Dim cin As System.IO.TextReader = Console.In
    9. Sub Main()
    10. Dim ipHostInfo As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry(mcserver)
    11. Dim EP As New System.Net.IPEndPoint(ipHostInfo.AddressList(0), port)
    12. sock = New System.Net.Sockets.Socket(EP.Address.AddressFamily, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)
    13. sock.Connect(mcserver, port)
    14. Console.WriteLine("[STATUS] Verbunden zu " & mcserver & " auf Port " & port)
    15. ' Hier sollte er jetzt die LOGIN-Daten an den Server senden...
    16. While sock.Connected = True
    17. Dim mail As String = recv()
    18. Console.WriteLine(mail)
    19. End While
    20. End Sub
    21. Sub send(ByVal msg As String)
    22. msg &= vbCr & vbLf
    23. Dim data() As Byte = System.Text.ASCIIEncoding.UTF8.GetBytes(msg)
    24. sock.Send(data, msg.Length, System.Net.Sockets.SocketFlags.None)
    25. End Sub
    26. Function recv() As String
    27. Try
    28. Dim data(4096) As Byte
    29. sock.Receive(data, 4096, System.Net.Sockets.SocketFlags.None)
    30. Dim mail As String = System.Text.ASCIIEncoding.UTF8.GetString(data)
    31. 'Auswerten
    32. mail = mail.TrimEnd(Chr(0))
    33. mail = mail.Remove(mail.LastIndexOf(vbLf), 1)
    34. mail = mail.Remove(mail.LastIndexOf(vbCr), 1)
    35. Return mail
    36. Catch
    37. Console.WriteLine("[AKTION] Verbindung geschlossen")
    38. Console.WriteLine("[FEHLER] Keine Verbindung zum Server!")
    39. Console.ReadKey()
    40. Return "ERROR"
    41. End Try
    42. End Function
    43. End Module


    So... Die Verbindung geht schonmal...

    Jetzt hab ich nur keine Ahnung, was ich jetzt senden muss.
    Zum Beispiel wenn ich den Spielernamen senden möchte:

    VB.NET-Quellcode

    1. send("0x01 Username SPIELERNAME")

    Funktioniert nicht (der Server trennt die Verbindung, weil anscheinend etwas falsches gesendet wurde)"
    Eine genaue Beschreibung was man senden muss finde ich nicht (Der Hauptgrund dieses Posts)...



    Und noch was:

    Am Anfang der Function RECV findet man ja diesen Code hier:

    VB.NET-Quellcode

    1. Dim data(123456789) As Byte
    2. sock.Receive(data, 123456789, System.Net.Sockets.SocketFlags.None)


    Was soll ich statt

    VB.NET-Quellcode

    1. 123456789
    einsetzen?

    (Sorry, hab noch nie mit solchen Protokollen gearbeitet)

    Hoffe mir kann jemand helfen :?:

    Janik ;)
    Hi.

    Sowas wird für gewöhnlich binär geregelt.
    Für einen BinaryWriter würde der Code zum Senden des Namens ungefähr so aussehen:

    VB.NET-Quellcode

    1. _BinaryWriter.Write(14) ' Protokoll-Version
    2. Dim DeinName As String = "haiyyu"
    3. _BinaryWriter.Write(Int16.Parse(DeinName.Length))
    4. _BinaryWriter.Write(DeinName.ToCharArray()) ' Erst musst du den Namen noch ins UCF2-Format konvertieren
    5. _BinaryWriter.Write(Int64.Parse(0))
    6. _BinaryWriter.Write(Byte.Parse(0))
    7. _BinaryWriter.Flush()
    Das ist für den Login-Request des Clienten.
    Wie du lesen kannst, nicht vollständig.

    haiyyu schrieb:

    Sowas wird für gewöhnlich binär geregelt.
    Für einen BinaryWriter würde der Code zum Senden des Namens ungefähr so aussehen:

    VB.NET-Quellcode

    1. _BinaryWriter.Write(14) ' Protokoll-Version
    2. Dim DeinName As String = "haiyyu"
    3. _BinaryWriter.Write(Int16.Parse(DeinName.Length))
    4. _BinaryWriter.Write(DeinName.ToCharArray()) ' Erst musst du den Namen noch ins UCF2-Format konvertieren
    5. _BinaryWriter.Write(Int64.Parse(0))
    6. _BinaryWriter.Write(Byte.Parse(0))
    7. _BinaryWriter.Flush()
    Das ist für den Login-Request des Clienten.
    Wie du lesen kannst, nicht vollständig.
    Juhu, jetzt hab ich es kapiert 10000 Dank :) :thumbsup:

    ThuCommix schrieb:

    Ohne minecraft.net login, funktiniert das doch eh nicht?
    Dort bin ich registriert und der Bot soll sich jetzt nur noch einloggen. Oder wie meist du das :?:

    Janik

    nikeee13 schrieb:

    Warum nicht statt "Byte.Parse(0)" einfach "0B" nehmen?
    Danke. Und jetzt kommt die peinlichste Frage, die ich je gestellt hab :wacko:
    Ausführliche Frage
    Ich hab den _BinaryWriter jetzt so deklariert

    VB.NET-Quellcode

    1. Dim _BinaryWriter As System.IO.BinaryWriter()

    Da bekomme ich jetzt einen
    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Fehler.
    Also deklariere ich es als New und muss dann muss ich aber den Parameter Output As System.IO.Stream
    angeben. Da hab ich einen neuen Stream deklariert...

    VB.NET-Quellcode

    1. Dim _Stream As System.IO.Stream

    Aber dann stürzt er auch ab...
    Der Wert darf nicht NULL sein.
    Parametername: output





    Also: Als was deklariere ich den _BinaryWriter? Als New oder nicht?

    Sorry für die blöden Fragen, ich wusste bisher nicht einmal dass ein BinaryWriter existiert...

    Janik

    Minecraft NPC: 5%

    Warum nicht statt "Byte.Parse(0)" einfach "0B" nehmen?

    Nicht nur das

    VB.NET-Quellcode

    1. Byte.Parse(0) = Byte.Parse(0.ToString()) = Byte.Parse("0")

    Also nicht ganz das was es sein sollte, oder?!

    Wenn man mal keine Konstante hat sollte dann eher das hier herhalten:
    msdn.microsoft.com/en-us/library/system.convert.tobyte.aspx

    Ansonsten natürlich B Anhängen ;)

    @TE: Du darfst hier außerdem nicht Byte senden, sondern musst SByte(signed Byte) verwenden, da Byte in .Net von 0-255 geht, laut Protokoll aber von -128-127 gehen soll...

    Bei string8 musst eine Zahl vom Type Short vorraussenden(welche die Länge des Strings enthält) und bei string16 ebenfalls Short vorraus, jedoch musst du dort den String UTF16 codiert versenden(2 Byte pro Zeichen)...


    Und natürlich auch Metadate und Bool, alles in allem steht ne Menge nicht unbedingt einfacher Arbeit vor dir...


    Da gibst du den NetworkStream an, den du vom TcpClienten per GetStream() bekommst.

    Richtig, in diesem Sinne würde ich dir empfehlen einen TCPClienten zu verwenden und nicht wie hier von Grund auf über die Socket-Klasse:
    [VB.NET] Ausführliches TCP und UDP Tutorial

    Dich interessiert dabei natürlich der TCP Client..
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    Ansonsten natürlich B Anhängen ;)
    Es gibt natürlich auch andere Buchstaben für andere Datentypen. ;)
    Ein c hinter einem Buchstaben in Anführungstrichen: "A"c kennzeichnet einen Char.

    Ein I einen Integer: 16I
    Ein D kennzeichnet auch etwas, entweder einen Decimal oder einen Double (hab ich gerade vergessen ;)): 1.0D
    Ein S kennzeichnet einen Single: 1.0S
    ... usw.

    In C# gibt es ein F für Floats.
    Von meinem iPhone gesendet
    Stimmt, sorry, dachte, dass Parse mehr als nur String annimmt.
    Naja, danke für die Aufklärung. Nächtes Mal mach ichs besser, versprochen. :)

    VB.NET-Quellcode

    1. Dim vDecimal As Decimal = 13.37D
    2. Dim vDouble As Double = 13.37R
    3. Dim vFloat As Single = 13.37F
    Der Rest ist hier nachzulesen:
    en.wikibooks.org/wiki/Visual_B…ables#Suffix_for_Literals