Diese Seite enthält Inhalte, die nur in veralteten Versionen von Minecraft existieren. Diese Funktion war früher im Spiel vorhanden, wurde aber inzwischen entfernt.
|
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[]
Heartbeats[]
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 "Heartbeat" 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[]
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[]
Jedes Paket beginnt mit einem Byte-Wert (Zahl zwischen 0 und 255), welcher die Paket-ID festlegt.
Protokoll Datentypen[]
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[]
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[]
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.
|
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[]
Koordinaten[]
Die Spielerposition wird durch X-, Y-, und Z-Koordinaten in Form von Festkommazahlen dargestellt. Die Nachkommastellen stehen in den letzten 5 Bit, 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[]
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[]
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[]
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.
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 |
Standard-Ressourcen |
| ||||
---|---|---|---|---|---|
Standard-Weltdaten |
| ||||
Spielwelt | |||||
Software | |||||
Speicherformate | |||||
Einstellungen | |||||
Mehrspieler |
| ||||
Historisch |