Das offizielle Minecraft Wiki twittert hier: Wiki-Twitter  –  Chatte im Wiki-Discord  – Noch keinen Server gefunden? Es gibt einen Wiki-Server

Classic-Server Protokoll

Aus Minecraft Wiki
Wechseln zu: Navigation, Suche
Dieser Artikel oder Abschnitt enthält Informationen über Funktionen, die entweder veraltet sind oder aus dem Spiel entfernt wurden.
Sie existieren daher nur in älteren Versionen von Minecraft.

Die Minecraft-Classic-Zeit ist lange vorbei. Sie endete im Juni 2010. Trotzdem gibt es immer noch Fans der allerersten Minecraft-Version, die sich mittlerweile stark von der aktuellen Version unterscheidet. Diese Fans spielen auf sogenannten Classic-Servern.

In diesem Artikel wird das Server-Protokoll beschrieben, mit dem Informationen zwischen Client und Sever ausgetauscht werden.

Verbindung mit Minecraft.net[Bearbeiten]

Heartbeats[Bearbeiten]

Damit man sich mit einem Classic-Server aus der oben genannten Liste verbinden kann, muss dieser alle paar Minuten eine Nachricht, genannt "Heartbeat" (Herzschlag), an minecraft.net senden. Ein Vanilla-Server sendet seinen Heartbeat alle 45 Sekunden.

Ein "Hartbeat" ist eine HTTP-Anfrage an https://minecraft.net/heartbeat.jsp. Nachdem er gesendet wurde, schicken die Mojang-Server als Antwort die URL für den Server. Der Heartbeat kann eine GET- oder eine POST-Abfrage sein. Folgende Parameter sind notwendig:

Name Details
port Nummer des Ports auf dem der Server laufen soll. Im Normalfall 25565
max Die maximale Anzahl von Spielern
name Der Name des Servers
public "True", wenn der Server öffentlich ist (z.B wenn er in der Liste erscheint), "False" wenn nicht. (Die Großschreibung ist relevant!)
version Minecraft Version, muss "7" sein.
salt Ein zufälliger 16-stelliger Salt-Wert aus einem Alphabet von 62 Zeichen (Ziffern 0–9, Großbuchstaben A–Z und Kleinbuchstaben a–z). Ein Salt-Wert dient zum nochmaligen Verschlüsseln ("Versalzen") von bereits verschlüsselten Passwörtern oder IDs, damit gleiche Passwörter von außen unterschiedlich aussehen.
users Anzahl der Spieler, die im Moment verbunden sind.

Der einfachste Weg einen Heartbeat zu senden, ist einen TCP-Socket am Port 80 auf "minecraft.net" zu öffnen, und das folgende zu senden: (natürlich mit geänderten Werten):

GET /heartbeat.jsp?port=25565&max=32&name=My%20Server&public=True&version=7&salt=wo6kVAHjxoJcInKx&users=0 gefolgt von einem CRLF-Zeichen (engl. Carriage-Return and Line Feed = Absatz und neue Zeile).

Dabei muss darauf geachtet werden, dass Sonderzeichen in Zeichenfolgen umgewandelt werden (im Beispiel "My%20Server" statt "My Server", d.h. das Sonderzeichen "Leerzeichen" wird als "%20" geschrieben).

Wenn keine Fehler auftreten, liefert die Antwort eine URL. Ansonsten antworten die Server mit einer HTML Error-Nachricht. Es müssen keine HTML-Header analysiert werden, da das HTTP-Protokoll nicht spezifiziert ist, wodurch HTML/0.9 verwendet wird, welches keinen Header hat.

Nutzer-Authentifizierung[Bearbeiten]

Der Zugangsschlüssel ("key") mit dem ein Spieler sich verbindet, kann mit der MD5-Prüfsumme des Salt-Wertes (siehe oben) des Servers plus dem Spielernamen verglichen werden, um zu überprüfen, ob der Spieler sich von der minecraft.net Seite aus anmeldet. Somit kann der Spielername abgesichert werden, sodass man Bans und OP-Rechte über den Namen vergeben kann.

if( player.key == md5( server.salt + player.name ) ) {
 // Der Spieler ist über minecraft.net angemeldet
} else {
 // Der Spieler fälscht den Nutzernamen
}

Auf diese Weise werden auch gekrackte Clients vom Verbinden zu Servern im Online-Modus abgehalten. Wenn ein gecrackter Client versucht zu solch einem Server zu verbinden, so erhält er die Nachricht: "Failed to Connect: User Not Premium".

Anmerkung: Das bedeutet, dass man den Salt-Wert des Servers geheim halten, und lediglich heartbeat.jsp mitteilen sollte. Wenn der Salt-Wert für Nutzer sichtbar ist, haben Hacker leichtes Spiel, sich gültige Zugangsschlüssel zu verschaffen.

Paket-Protokoll[Bearbeiten]

Jedes Paket beginnt mit einem Byte-Wert (Zahl zwischen 0 und 255), welcher die Paket-ID festlegt.

Protokoll Datentypen[Bearbeiten]

Typ Größe in Bytes 'Beschreibung
Byte 1 Single byte integer (0 bis 255)
SByte 1 Single byte signed integer (-128 bis 127)
Short 2 Signed integer, network order (-32768 bis 32767)
String 64 Enkodierte US-ASCII/ISO646-US Zeichenfolge, getrennt durch Leerzeichen (0x20)
Byte array 1024 Binäre Daten, getrennt durch Null-Bytes (0x00)

Pakete: Client => Server[Bearbeiten]

Paket-ID Zweck Feldbeschreibung Feldtyp Anmerkungen
0x00 Spieler-Identifikation Paket-ID Byte Wird von einem Spieler beim Verbinden zum Server gesendet und enthält die relevanten Informationen. Die aktuelle Protokoll-Version ist 0x07.
Protokoll-Version Byte
Nutzername String
Zugangsschlüssel String
Ungenutzt Byte
0x05 Setzen eines Blockes Paket-ID Byte Wird gesendet, wenn der Spieler einen Block setzt. Der Modus beschreibt ob der Block gesetzt (0x01) oder zerstört wurde (0x00). Der Block-Typ ist immer der Block, den der Spieler hält (auch beim Zerstören).

Der Client nimmt an, dass diese Anfrage immer Erfolg hat, und so wird der neue Block sofort gerendert. Um das Verändern von Blöcken zu verbieten, muss der Server ein "Set Block" zurücksenden.

Die Koordinaten sind, im Gegensatz zu denen eines Spielers, nur Integer-Werte und geben die Position des Blockes an.

X Short
Y Short
Z Short
Modus Byte
Block-Typ Byte
0x08 Position und Ausrichtung Paket-ID Byte Wird dauerhaft gesendet, auch wenn der Spieler sich nicht bewegt. Die Spieler-ID ist immer 255, was immer der sendende Spieler ist. Die Spielerkoordinaten sind unten erklärt.
Spieler-ID Byte
X Short
Y Short
Z Short
Yaw (Drehungswinkel) Byte
Pitch (Neigungswinkel) Byte
0x0d Nachricht Paket-ID Byte Enthält eine Chat-Nachricht des Spielers.
Unbenutzt, eventuell die Farbe Byte (0xFF)
Nachricht String

Pakete: Client <= Server[Bearbeiten]

Paket-ID Zweck Feldbeschreibung Feldtyp Notes
0x00 Server-Identifikation Paket-ID Byte Antwort auf das Verbinden mit dem Server. Der Typ besagt, ob der Spieler OP-Rechte hat (0x64) oder nicht (0x00). Die aktuelle Protokoll-Version ist 0x07.
Protokoll-Version Byte
Server Name String
Server MOTD (Message of the day) String
Nutzer-Typ Byte
0x01 Ping Paket ID Byte Wird regelmäßig an die Clients gesendet. Die zur Zeit einzige Möglichkeit die Verbindung zu trennen, ist Minecraft Classic zu beenden, was dem Server nicht mitgeteilt wird. Das Ping-Paket wird genutzt um festzustellen, ob die Verbindung noch besteht.
0x02 Weltdaten Initialisierung Paket-ID Byte Meldet dem Client, dass nun Weltdaten folgen. Die Welt wurde damals noch "Level" genannt.
0x03 Chunk Paket-ID Byte Enthält ein Blockdatenpaket aus den Weltdaten. Die Weltdaten sind in einer Datei im gzip-Format zusammengefasst (siehe Classic Level Format). Die Blockdaten werden in 1024 Byte großen Paketen versendet, die "Chunk" genannt werden und nicht mit dem Chunk der späteren Weltdatenformate, die auf die Classic-Phase folgten, verwechselt werden dürfen. Ein Blockdatenpaket wird mit Nullbytes aufgefüllt, wenn es weniger Blockdaten enthält.
Chunk-Länge Short
Chunk-Daten Byte Array
Fertigstellung (in %) Byte
0x04 Level-Ende Paket-ID Byte Wird gesendet, nachdem die gesamte Welt übertragen ist und gibt ihre Größe an. Die Y-Koordinate zeigt, wie hoch die Welt ist.
X-Größe Short
Y-Größe Short
Z-Größe Short
0x06 Block setzen Paket-ID Byte Wird gesendet, um eine Veränderung an den Blöcken durch Spieler oder Spiel-Physik anzuzeigen. Wurde der Block von einem Spieler geändert, wird dem Spieler trotzdem dieses Paket geschickt.
X Short
Y Short
Z Short
Block-Typ Byte
0x07 Spieler erschaffen Paket-ID Byte Wird gesendet um anzuzeigen, wo ein neuer Spieler die Welt betreten hat. Position und Ausrichtung werden wie im Paket 0x08 (s.u.) verschlüsselt.
Spieler-ID SByte
Spieler Name String
X Short
Y Short
Z Short
Yaw (Drehungswinkel) Byte
Pitch (Neigungswinkel) Byte
0x08 Position und Ausrichtung (Spieler-Teleportation) Packet ID Byte Wird gesendet, wenn sich Position oder Ausrichtung eines Spielers ändern. Teleportiert den Spieler, an den das Paket gesendet wurde, wenn ID < 0. Das wird für das Senden der Position beim Verbinden und für den Befehl /tp verwendet.
Spieler-ID SByte
X Short
Y Short
Z Short
Yaw (Drehungswinkel) Byte
Pitch (Neigungswinkel) Byte
0x09 Positions- und Aurichtungsaktualisierung Paket-ID Byte Wird mit Änderungen an Position und Ausrichtung gesendet, wenn sich beides gleichzeitig ändert. Wird nicht unbedingt benötigt, damit der Server lauffähig ist.
Spieler-ID SByte
X-Änderung SByte
Y-Änderung SByte
Z-Änderung SByte
Yaw (Drehungswinkel) Byte
Pitch (Neigungswinkel) Byte
0x0a Positionsaktualisierung Paket-ID Byte Wird gesendet, wenn sich die Spielerposition ändert. Wird nicht unbedingt benötigt, damit der Server lauffähig ist.
Spieler-ID SByte
X-Änderung SByte
Y-Änderung SByte
Z-Änderung SByte
0x0b Ausrichtungsaktualisierung Paket-ID Byte Wird gesendet, wenn sich die Spieler-Ausrichtung ändert. Wird nicht unbedingt benötigt, damit der Server lauffähig ist.
Spieler-ID SByte
Yaw (Drehungswinkel) Byte
Pitch (Neigungswinkel) Byte
0x0c Spieler entfernen Paket-ID Byte Wird gesendet, wenn ein Spieler die Verbindung trennt.
Spieler-ID SByte
0x0d Nachricht Packet ID Byte Eine von einem Spieler oder der Konsole gesendete Chat-Nachricht.
Spieler-ID SByte
Nachricht String
0x0e Verbindung trennen Paket-ID Byte Wird an einen Spieler gesendet, wenn der Server die Verbindung trennt.
  1. Der Grund "Cheat detected: Distance" wird gesendet, wenn der Spieler Blöcke zu weit entfernt verändert, aber auch wenn er unmittelbar nachdem er sich bewegt hat, Blöcke verändert.
  2. Der Grund "Cheat detected: Tile type" wird gesendet, wenn der Spieler einen Block hat, den er im Überlebensmodus nicht haben kann.
Grund der Trennung String
0x0f Nutzer-Typ aktualisieren Paket-ID Byte Wird gesendet, wenn ein Spieler OP-Rechte bekommt, oder sie ihm entzogen werden. Das gibt dem Spieler die Möglichkeit Grundgestein zu setzen und abzubauen, beziehungsweise entzieht sie ihm. Nutzer-Typ 100 bedeutet OP-Rechte zu bekommen, Nutzer-Typ 0 bedeutet, OP-Rechte zu verlieren.
Nutzer-Typ Byte

Spielerposition[Bearbeiten]

Koordinaten[Bearbeiten]

Die Spielerposition wird durch X-, Y-, und Z-Koordinaten in Form von Festkommazahlen dargestellt. Die Nachkommastellen stehen in den letzten 5 Bits, also erhält man beim Dividieren der erhaltenen Werte (zum Beispiel im Postionsaktualisierungs-Paket) durch 32 eine Fließkommazahl, die die Koordinate mit Nachkommastellen angibt. Diese Koordinaten beziehen sich auf den Mittelpunkt der Spieleransicht.

Auf Blöcken stehen[Bearbeiten]

Die Unterseite der Spielerfüße befindet sich 1.59375 (Festkommawert: 51) Einheiten unter dem Mittelpunkt der Spieleransicht, also kann man, um einen Spieler auf einem Block zu positionieren, ein Spieler-Teleportations-Paket (0x08) senden mit dem Y-Wert der sich aus der Y-Koordinate des Blockes wie folgt berechnet: (Y x 32 + 51)

Ausrichtung[Bearbeiten]

Ein Yaw (Drehungswinkel) von 0 bedeutet, dass der Spieler in negative Z-Richtung guckt. Dieser Wert vergrößert sich im Uhrzeigersinn (von oben betrachtet). Legt man die negative Z-Richtung als "Norden" fest, so bedeutet ein Yaw-Wert von 64 "Osten", von 128 "Süden", und von 192 "Westen".

Ein Pitch (Neigungswinkel) von 0 bedeutet, dass der Spieler geradeaus guckt, dieser Wert erhöht sich nach unten. Der Wert 64 bedeutet "ganz unten", und 192 "ganz oben". Werte zwischen 65 und 191 sollten niemals auftauchen, da der Spieler seinen Kopf nicht weiter neigen kann als im Bereich 0 bis 64 und 192 bis 255. Allerdings ignoriert der Client falsche Werte nicht, sodass man Spielerköpfe "auf den Kopf stellen" kann.

Farbcodes[Bearbeiten]

Nachrichten vom Server an den Client können Farbcodes enthalten, welche zu verschiedenen Zwecken genutzt werden können.

Ein Und-Symbol (&) gefolgt von einer hexadezimalen Ziffer zeigt dem Client, dass die Farbe geändert werden soll. Die aktuellen Formatierungscodes unterscheiden sich von den Codes aus der Classiczeit lediglich darin, dass statt dem &-Symbol ein Paragraphenzeichen (§), welches nicht im Chat eingegeben werden kann, verwendet wird, und dass einige weitere Formatierungen wie kursive, fette oder unterstrichene Schrift möglich sind.

Farbcodes am Anfang einer Nachricht funktionieren nur, wenn die Spieler-ID kleiner als 127 ist, ansonsten wird am Anfang automatisch der Code "&e" (gelb) gesetzt. Alle anderen Farbcodes später in der Nachricht funktionieren aber.

Zuordnung der Ziffern zu den Farben
Beispiel Code Üblicher Name Alternativer Name Vordergrundfarbe Hintergrundfarbe
R G B HEX R G B HEX
&0 Schwarz Schwarz 0 0 0 #000 0 0 0 #000000
&1 Dunkelblau Marine 0 0 170 #00A 0 0 42 #00002A
&2 Dunkelgrün Grün 0 170 0 #0A0 0 42 0 #002A00
&3 Blaugrün Blaugrün 0 170 170 #0AA 0 42 42 #002A2A
&4 Dunkelrot Kastanienbraun 170 0 0 #A00 42 0 0 #2A0000
&5 Violett Violett 170 0 170 #A0A 42 0 42 #2A002A
&6 Dunkelgelb Gold 170 170 0 #AA0 42 42 0 #2A2A00
&7 Grau Silber 170 170 170 #AAA 42 42 42 #2A2A2A
&8 Dunkelgrau Grau 85 85 85 #555 21 21 21 #151515
&9 Indigo Blau 85 85 255 #55F 21 21 63 #15153F
&a Hellgrün Gelbgrün 85 255 85 #5F5 21 63 21 #153F15
&b Cyan Aquamarin 85 255 255 #5FF 21 63 63 #153F3F
&c Rot Rot 255 85 85 #F55 63 21 21 #3F1515
&d Pink Pink 255 85 255 #F5F 63 21 63 #3F153F
&e Gelb Gelb 255 255 85 #FF5 63 63 21 #3F3F15
&f Weiß Weiß 255 255 255 #FFF 63 63 63 #3F3F3F
Promotional Content