Serveur minecraft

Protocole de serveur classique – Le wiki officiel de Minecraft – Resoudre les problemes d’un serveur MineCraft

Le 16 mars 2020 - 5 minutes de lecture

Avertissement ! La traduction française des termes techniques n'est pas nécessairement très bonne. Si vous souhaitez plus d'informations sur certains points techniques, rendez-vous sur la page en anglais.

Documentation du protocole de serveur utilisé par les serveurs Minecraft Classic.

Pulsations cardiaques[[[[Éditer | modifier le wikicode]

Pour pouvoir se connecter à un serveur Minecraft Classic à partir de la liste des serveurs, le serveur doit envoyer à minecraft.net un "battement de coeur" (environ "battement de coeur") toutes les minutes, environ.

Le serveur stocke ce rythme cardiaque pendant 45 secondes.

Le «battement de cœur» prend la forme d'une demande HTTP sur http://www.minecraft.net/heartbeat.jsp.
Après avoir envoyé la pulsation, l'URL du serveur est renvoyée.

Cela peut être une demande POST ou GET. Voici le tableau des paramètres ci-dessous:

Nom Détails
port Le port du serveur. La valeur par défaut est 25565
max Le quota maximum de joueurs sur le serveur.
Nom Le nom du serveur.
Publique Si le serveur est public (c'est-à-dire s'il apparaît dans la liste) ou non. Cela peut être Vrai ou Faux (même forme).
version Historique des versions, normalement la version doit être 0x07.
sel Une clé aléatoire de 16 caractères en base 62 (appelée "sel" ou "grain de sel")
utilisateurs Le nombre de joueurs actuellement connectés au serveur.

La façon la plus simple d'envoyer un battement de cœur est d'ouvrir un socket TCP sur le port 80 à l'adresse suivante: www.minecraft.net, et d'envoyer les valeurs (qui doivent être modifiées, bien sûr).

GET /heartbeat.jsp?port=25565&max=32&name=My%20Server&public=True&version=7&salt=wo6kVAHjxoJcInKx&users=0, avec un CRLF (retour chariot et saut de ligne, traduit par retour chariot et saut de ligne).

Assurez-vous que toutes les chaînes sont échappées, c'est-à-dire un retour chariot à la fin de la ligne.

Dans le corps de la réponse, vous pourrez récupérer l'URL. Sinon, vous recevrez une erreur HTML, souvent limitée à un simple ""dans la version Client.

(Remarque: aucun en-tête n'est renvoyé si vous utilisez le format de requête HTTP / 0.9 comme indiqué précédemment, ce qui rend cette méthode plus simple qu'auparavant.)

Authentification d'utilisateur[[[[Éditer | modifier le wikicode]

La clé qui est donnée lorsqu'un utilisateur rejoint le serveur doit être comparée à la vérification MD5 du serveur "salt" avec le nom d'utilisateur pour vérifier que l'utilisateur est enregistré sur minecraft.net avec ce nom d'utilisateur. Grâce à cela, le nom du joueur devient un critère suffisamment fiable pour bannir ou noter par son nom.

if (player.key == md5 (server.salt + player.name)) 
// le joueur est inscrit sur Minecraft.net
 autre 
// le joueur n'est pas enregistré.

N.B.: Cela signifie que votre "grain de sel" doit être gardé secret et ne doit être partagé qu'avec heartbeat.jsp. Si le "grain de sel" de votre serveur est visible n'importe où par n'importe quel utilisateur, cela devient un jeu d'enfant pour les pirates de créer une clé qui semble valide, sans avoir besoin de s'authentifier sur minecraft.net.

Skins[[[[Éditer | modifier le wikicode]

Les skins pour un joueur sont téléchargés par le client à l'adresse suivante: https://s3.amazonaws.com/MinecraftSkins/skinname.png et à http://minecraft.net/skin/skinname.png, ou "skinname" est le nom du joueur. Cela signifie que le nom du joueur peut être erroné pour donner à un joueur un skin spécial.

Les messages envoyés par le serveur au lecteur peuvent contenir des couleurs, ce qui permet de colorer le texte pour différentes utilisations.

Une esperluette (&) suivie d'une valeur hexadécimale dans le message indique au client la couleur à utiliser.

Les couleurs ne fonctionneront que si l'ID du joueur est inférieur à 127. S'il est de 127 ou plus, le jeu ajoutera automatiquement un & e (couleur jaune) avant le message, qui deviendra jaune. Cependant, les codes de couleur après le premier caractère fonctionnent toujours. Si vous utilisez un ID inférieur à 127, il n'ajoutera pas de code couleur, vous pouvez donc choisir n'importe quelle couleur.

Il est important de noter que si une esperluette à la fin d'un message n'est pas suivie d'une valeur hexadécimale, tous les clients qui reçoivent cette valeur se bloqueront. Il est donc nécessaire de garantir les données que le serveur envoie.

Mappage des chiffres hexadécimaux aux couleurs
Couleur Codé Nom commun Couleur du texte Couleur d'ombre
R g B R g B
& 0 Noir 0 0 0 0 0 0
& 1 Bleu foncé 0 0 191 0 0 47
& 2 Vert foncé 0 191 0 0 47 0
& 3 Turquoise foncé 0 191 191 0 47 47
& 4 Rouge foncé 191 0 0 47 0 0
& 5 Violet 191 0 191 47 0 47
& 6 Or 191 191 0 47 47 0
& sept Gris 191 191 191 47 47 47
& 8 Gris foncé 64 64 64 16 16 16
& 9 Bleu 64 64 255 16 16 63
Vert clair 64 255 64 16 63 16
& b Turquoise 64 255 255 16 63 63
&contre rouge 255 64 64 63 16 16
& ré Rose 255 64 255 63 16 63
& e Jaune 255 255 64 63 63 16
& F blanc 255 255 255 63 63 63

Chaque package commence par une variable de type "octet" qui représente l'ID du package.

Types de données de protocole[[[[Éditer | modifier le wikicode]

Type Couper[octets] La description
Octet 1 Un octet représentant un entier non signé (0 à 255)
SByte 1 Un octet représentant un entier signé (-128 à 127)
Short 2 Un entier signé, ordre réseau (-32768 à 32767)
Chaîne 64 US-ASCII / ISO646-US: chaîne de caractères codée complétée par des espaces (0x20)
Tableau d'octets 1024 Données binaires complétées par "octets nuls" (0x00)

Client -> Packages serveur[[[[Éditer | modifier le wikicode]

Identifiant du package Affectation La description Type Remarques
0x00 Identification du joueur Identifiant du package Octet Envoyé par un joueur avec des informations pertinentes. Le protocole Minecraft Classic est en version 0x07.
Version du protocole Octet
Nom d'utilisateur Chaîne
Clé de vérification Chaîne
Non utilisé Octet
0x05 Définir le bloc Identifiant du package Octet Est envoyé lorsqu'un joueur modifie un bloc. Le mode 0x01 indique que le bloc est installé, 0x00 indique que le bloc est détruit.

Le type de bloc est toujours le type de bloc que le joueur a en main.

Le client suppose que ce package est toujours réussi et crée donc le nouveau bloc immédiatement. Pour interdire la création de blocs, le serveur doit répondre avec un paquet Set Block pour modifier ce bloc avec l'ancien type de bloc.

Les coordonnées XYZ du bloc ne sont que des entiers qui représentent les coordonnées du bloc. (Contrairement aux coordonnées du joueur dont les 5 premiers bits représentent la partie décimale).

X Short
Oui Short
Z Short
Mode Octet
Type de bloc Octet
0x08 Position et orientation Identifiant du package Octet Envoyé fréquemment (même si le joueur ne bouge pas) par le joueur avec la position et l'orientation du joueur. L'ID du joueur est toujours 255, ce qui fait référence à lui-même. Les coordonnées du joueur sont des points fixes (5 bits) qui représentent la position de partage (astuce: divisez par 32 pour obtenir la position actuelle). Le paramètre "angle" est mis à l'échelle de sorte qu'une valeur de 256 doit correspondre à 360 °.
Identifiant du joueur Octet
X Short
Oui Short
Z Short
Lacet (cap) Octet
Pas Octet
0x0d Message Identifiant du package Octet Contient les messages des joueurs envoyés dans le chat.
Non utilisé, peut-être les couleurs du message. Octet (0xFF)
Message Chaîne

Serveur → Paquets clients[[[[Éditer | modifier le wikicode]

Identifiant du package Affectation La description Type Remarques
0x00 Identification du serveur Identifiant du package Octet La réponse à un joueur essayant de rejoindre le serveur. Le type d'utilisateur indique si le joueur est un opérateur (0x64) ou non (0x00). La version du protocole en ce moment est 0x07.
Version du protocole Octet
Nom du serveur Chaîne
MOTD depuis le serveur Chaîne
Type d'utilisateur Octet
0x01 Ping Identifiant du package Octet Est envoyé aux clients périodiquement. La seule façon de se déconnecter pour un client est de forcer la déconnexion, mais dans ce cas, le serveur ne sait pas si le lecteur n'est plus là ou s'il est toujours connecté. Le paquet ping est utilisé pour déterminer si la connexion est toujours ouverte.
0x02 Initialisation de niveau Identifiant du package Octet Avertit le joueur que les données de la carte arrivent. Dès lors, le client affiche un écran de chargement.
0x03 Données au niveau de la section Identifiant du package Octet Ce package vous permet d'envoyer au client un fragment des données cartographiques. Les données cartographiques sont présentées sous la forme d'une table d'octets compressée au format GZip comprenant:

  • Un entier sur 4 octets qui indique le nombre de blocs dans la carte (largeur * hauteur * profondeur)
  • Un tableau de types de blocs qui représente la carte que le serveur envoie au joueur

Chaque section est un fragment des données cartographiques de 1024 octets.

Si la taille de la section est inférieure à 1024, elle est complétée par 0x00.

Longueur de section Short
Données de section Tableau d'octets
Pourcentage achevé Octet
0x04 Achèvement du niveau Identifiant du package Octet Ce paquet est envoyé après le dernier tronçon et contient la taille de la carte. Cela a pour effet de supprimer l'écran de chargement du client.
Taille X Short
Taille Y Short
Taille Z Short
0x06 Modification de bloc (serveur) Identifiant du package Octet Envoyé pour indiquer un changement de bloc par des événements physiques ou des joueurs. Le colis doit être envoyé à tous les joueurs sur la même carte.
X Short
Oui Short
Z Short
Type de bloc Octet
0x07 Apparence du joueur Identifiant du package Octet Est envoyé pour indiquer qu'un nouvel utilisateur apparaît sur le monde. L'ID est généré aléatoirement par le serveur et doit être unique pour chaque joueur sur la même carte. La position et l'orientation sont codées de la même manière, comme le paquet 0x08 ci-dessus.

Ce colis doit également être envoyé au client lorsqu'il apparaît sur la carte, avec l'identifiant du joueur 255 (lui-même). Cela définit sa position d'apparence.

Identifiant du joueur SByte
Nom de joueur Chaîne
X Short
Oui Short
Z Short
Lacet (cap) Octet
Pas Octet
0x08 Mise à jour absolue de la position et de l'orientation du joueur. Identifiant du package Octet Ce package vous permet de téléporter le joueur en position (X; Y; Z) et de l'orienter. Si le client est connecté, l'ID du joueur doit être 255. Il est également utilisé pour informer le client des mouvements des autres joueurs.

Dans ce dernier cas, il est nécessaire d'envoyer ce paquet lorsque le joueur a déplacé un nombre de blocs strictement inférieur à -4,00 (-128 ou 0xFF en SByte), ou à partir d'une position supérieure ou égale à 4,00 (+127 ou 0x7F dans SByte).

Si le joueur n'a déplacé qu'un petit nombre de blocs (inférieur à -4,00 ou supérieur ou égal à 4,00), il est préférable d'envoyer le paquet n ° 9 pour économiser la bande passante, bien que ce ne soit pas obligatoire.

Identifiant du joueur SByte
X Short
Oui Short
Z Short
Lacet (cap) Octet
Pas Octet
0x09 Mise à jour de :

  • La position du joueur (par rapport à son ancienne position)
  • Orientation du joueur (absolue)
Identifiant du package Octet Ce package permet de mettre à jour la position du lecteur de manière relative, ainsi que son orientation. L'utilisation de ce paquet au lieu du paquet n ° 8 permet d'économiser 3 octets, mais uniquement à condition que la position du joueur n'ait été modifiée que par un nombre de blocs strictement inférieur à 4,00 ou supérieur ou égal à 4,00. Si cette condition n'est pas remplie, le package # 8 doit être utilisé à la place.
Identifiant du joueur SByte
Changements dans X SByte
Changements dans Y SByte
Z change SByte
Lacet (cap) Octet
Pas Octet
0x0a Mise à jour de la position du joueur (par rapport à son ancienne position) Identifiant du package Octet Ce package met à jour la position du joueur relativement. Ce pack peut être utilisé lorsque le joueur n'a pas tourné la tête et n'a déplacé qu'un nombre de blocs strictement inférieur à 4,00 ou supérieur ou égal à 4,00. Si cette condition n'est pas remplie, le package # 8 doit être utilisé à la place.
ID joueur SByte
Changements dans X SByte
Changements dans Y SByte
Changements dans SByte
0x0b Mise à jour de l'orientation du joueur Identifiant du package Octet Ce package met à jour l'orientation du lecteur. Ce package peut être utilisé lorsque seule l'orientation du joueur a été modifiée, pas sa position.
Identifiant du joueur SByte
Lacet (cap) Octet
Pas Octet
0x0c Disparition du joueur Identifiant du package Octet Envoyé lorsqu'un joueur se déconnecte.
ID joueur SByte
0x0d Message Identifiant du package Octet Messages envoyés par chat ou console.
ID joueur SByte
Message Chaîne
0x0e Déconnexion du joueur. Identifiant du package Octet Ce paquet a pour effet de déconnecter le client et d'afficher la raison de la déconnexion sur son écran.
Raison de la déconnexion Chaîne
0x0f Mise à jour du type d'utilisateur. Identifiant du package Octet Ce paquet est envoyé lorsque le statut du joueur change (type = 0x64 lorsque le joueur devient op, type = 0x00 lorsque le joueur redevient un joueur normal).
Type d'utilisateur Octet

Un point fixe[[[[Éditer | modifier le wikicode]

La position du joueur est représentée par les points fixes X, Y, Z. La partie fractionnaire est de 5 bits, donc divisez les entiers de type "court" dans la mise à jour de position par 32, vous avez une variable qui contient les coordonnées du joueur. Cette position représente le centre de la vue du joueur.

Sur un bloc[[[[Éditer | modifier le wikicode]

Le bas des pieds du joueur est situé à 1,59375 (point: 51) unité avant le centre. Ainsi, la position du joueur sur un bloc particulier devrait vous envoyer un paquet de "téléportation" (0x08) avec une valeur Y basée sur la position du bloc comme (Y x 32 + 51)

Orientation[[[[Éditer | modifier le wikicode]

A & # 39; Yaw & # 39; une valeur de 0 signifie que le joueur regarde dans une direction négative de Z (Z = 0). Cette valeur incrémente une direction dans le sens horaire, comme indiqué précédemment. Si une direction Z négative est appelée "Nord", le "Lacet" de 64 est l'Est, 128 est le Sud et 192 est l'Ouest.

Une valeur de pas de 0 signifie "niveau" et cette valeur augmente dans une direction opposée. 64 en bas et 192 en haut. Les valeurs de 65 à 191 ne doivent pas être rencontrées car le joueur ne peut regarder que dans l'intervalle [64; 191]. Cependant, Minecraft Classic prend en compte les valeurs non valides, il est donc possible de faire tourner la tête des joueurs.


Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.