Protocole – wiki.vg – Monter un serveur MineCraft

Author: Titanfall —

Short summary: Cette page présente une dissection du courant Protocole Minecraft. Si vous rencontrez des problèmes, consultez la FAQ ou demandez de l'aide sur le canal IRC #mcdevs sur chat.freenode.net (pour plus d'informations). Remarque: Bien que vous puissiez utiliser le contenu de cette page sans restriction pour créer des serveurs, des clients, des bots, etc., vous devez […]

Quick overview

Site
Tutos GameServer
Canonical URL
https://tutos-gameserver.fr/2019/08/12/protocole-wiki-vg-monter-un-serveur-minecraft/
LLM HTML version
https://tutos-gameserver.fr/2019/08/12/protocole-wiki-vg-monter-un-serveur-minecraft/llm
LLM JSON version
https://tutos-gameserver.fr/2019/08/12/protocole-wiki-vg-monter-un-serveur-minecraft/llm.json
Manifest
https://tutos-gameserver.fr/llm-endpoints-manifest.json
Estimated reading time
7 minutes (362 seconds)
Word count
1205

Key points

Primary visual

Protocole – wiki.vg

 – Monter un serveur MineCraft
Main illustration associated with the content.

Structured content

Cette page présente une dissection du courant Protocole Minecraft.

Si vous rencontrez des problèmes, consultez la FAQ ou demandez de l'aide sur le canal IRC #mcdevs sur chat.freenode.net (pour plus d'informations).

Remarque: Bien que vous puissiez utiliser le contenu de cette page sans restriction pour créer des serveurs, des clients, des bots, etc., vous devez néanmoins attribuer une attribution à #mcdevs si vous copiez le contenu de cette page pour le publier ailleurs.

Les modifications entre les versions peuvent être consultées dans l’historique du protocole.

Définitions Le serveur Minecraft accepte les connexions des clients TCP et communique avec eux via les paquets. Un paquet est une séquence d'octets envoyés via la connexion TCP. La signification d'un paquet dépend à la fois de son ID de paquet et de l'état actuel de la connexion. L'état initial de chaque connexion est Handshaking, et l'état est commuté à l'aide des paquets Handshake et Login Success.

Types de données Toutes les données envoyées sur le réseau (à l'exception de VarInt et de VarLong) sont big-endian, c'est-à-dire que les octets sont envoyés d'octet le plus significatif à l'octet le moins significatif. La majorité des ordinateurs de la vie courante étant de type little-endian, il peut être nécessaire de modifier l’endianisme avant d’envoyer des données sur le réseau.

prénom

Taille (octets)

Encode

Remarques

Booléen

1

Faux ou vrai

True est codé comme 0x01, faux comme 0x00.

Octet

1

Un entier compris entre -128 et 127

Entier de 8 bits signé, complément à deux

Octet non signé

1

Un entier compris entre 0 et 255

Nombre entier non signé de 8 bits

Court

2

Un entier compris entre -32768 et 32767

Entier signé de 16 bits, complément à deux

Short non signé

2

Un entier compris entre 0 et 65535

Entier 16 bits non signé

Int

4

Un entier compris entre -2147483648 et 2147483647

Entier 32 bits signé, complément à deux

Longue

8

Un entier compris entre -9223372036854775808 et 9223372036854775807

Entier 64 bits signé, complément à deux

Flotte

4

Nombre à virgule flottante IEEE 754 32 bits à simple précision

Double

8

Nombre à virgule flottante IEEE 754 64 bits double précision

String (n)

≥ 1 ≤ (n × 4) + 3

Une séquence de valeurs scalaires Unicode

La chaîne UTF-8 est préfixée avec sa taille en octets sous la forme d'un VarInt. Longueur maximale de n les caractères, qui varient selon le contexte; Jusqu'à n × 4 les octets peuvent être utilisés pour encoder n caractères et ces deux limites sont vérifiées. Maximum n La valeur est 32767. Le + 3 est dû à la taille maximale d'une longueur valide VarInt.

Bavarder

≥ 1 ≤ (32767 × 4) + 3

Voir le chat

Encodé en tant que chaîne avec une longueur maximale de 32767.

Identifiant

≥ 1 ≤ (32767 × 4) + 3

Voir Identifiant ci-dessous

Encodé en tant que chaîne avec une longueur maximale de 32767.

VarInt

≥ 1 ≤ 5

Un entier compris entre -2147483648 et 2147483647

Données de longueur variable codant un entier de 32 bits signé avec complément à deux; plus d'infos dans leur section

VarLong

≥ 1 ≤ 10

Un entier compris entre -9223372036854775808 et 9223372036854775807

Données de longueur variable codant un entier de 64 bits signé avec complément à deux; plus d'infos dans leur section

Métadonnées d'entité

Varie

Informations diverses sur une entité

Voir Entités # Format de métadonnées d'entité

Fente

Varie

Une pile d'objets dans un inventaire ou un conteneur

Voir les données d'emplacement

NBT Tag

Varie

Dépend du contexte

Voir NBT

Position

8

Un nombre entier / bloc: x (-33554432 à 33554431), y (-2048 à 2047), z (-33554432 à 33554431)

x en tant qu'entier sur 26 bits, suivi de y en tant qu'entier sur 12 bits, suivi de z en tant qu'entier sur 26 bits (tous signés, complément à deux). Voir aussi la section ci-dessous.

Angle

1

Un angle de rotation par paliers de 1/256 de tour complet

Peu importe que cela soit signé ou non, puisque les angles obtenus sont les mêmes.

UUID

16

Un UUID

Encodé sous la forme d'un entier non signé de 128 bits (ou de deux entiers non signés de 64 bits: les 64 bits les plus significatifs, puis les 64 bits les moins significatifs)

X optionnel

0 ou taille de X

Un champ de type X ou rien

Que le champ soit présent ou non doit être connu du contexte.

Tableau de X

compte fois la taille de X

Zéro ou plusieurs champs de type X

Le compte doit être connu du contexte.

X Enum

taille de X

Une valeur spécifique d'une liste donnée

La liste des valeurs possibles et la manière dont chacune est codée en tant que X doivent être connues à partir du contexte. Une valeur non valide envoyée par l'un ou l'autre côté entraînera généralement la déconnexion du client avec une erreur ou même un crash.

Tableau d'octets

Varie

Dépend du contexte

Ceci est juste une séquence de zéro octet ou plus, sa signification doit être expliquée ailleurs, par exemple. dans la description du paquet. La longueur doit également être connue à partir du contexte.

Identifiant Les identifiants sont un lieu d'espacement de noms, sous la forme: minecraft: chose. Si l'espace de nom n'est pas fourni, sa valeur par défaut est Minecraft (c'est à dire. chose est minecraft: chose. Le contenu personnalisé doit toujours figurer dans son propre espace de noms, pas celui par défaut. L'espace de noms ne doit utiliser que les caractères 01 234 5 6 78 9abcdefghijklmnopqrstuvwxyz-_; les noms réels peuvent contenir plus de symboles. La convention de nommage est lower_case_with_underscores. Plus d'information.

VarInt et VarLong Format de longueur variable tel que des nombres plus petits utilisent moins d'octets. Celles-ci sont très similaires à Varints de la mémoire tampon de protocole: les 7 bits les moins significatifs servent à coder la valeur et le bit le plus significatif indique s'il existe un autre octet après celui-ci pour la partie suivante du nombre. Le groupe le moins significatif est écrit en premier, suivi de chacun des groupes les plus significatifs; ainsi, les VarInts sont en réalité un peu endian (cependant, les groupes sont composés de 7 bits et non de 8).

VarInts ne dépasse jamais 5 octets et VarLongs ne dépasse jamais 10 octets.

Pseudocode pour lire et écrire VarInts et VarLongs:

public static int readVarInt ()     int numRead = 0;     int result = 0;     octet lu;     faire         read = readByte ();         int valeur = (lire & 0b01111111);         résultat while ((lire & 0b10000000)! = 0);

    retourne le résultat;

public statique long readVarLong ()     int numRead = 0;     résultat long = 0;     octet lu;     faire         read = readByte ();         int valeur = (lire & 0b01111111);         résultat while ((lire & 0b10000000)! = 0);

    retourne le résultat;

public statique void writeVarInt (int value)     faire         octet temp = (octet) (valeur & 0b01111111);         // Remarque: >>> signifie que le bit de signe est décalé avec le reste du nombre plutôt que d'être laissé seul         valeur >>> = 7;         si (valeur! = 0)             temp         writeByte (temp);      while (valeur! = 0);

public statique vide writeVarLong (valeur longue)     faire         octet temp = (octet) (valeur & 0b01111111);         // Remarque: >>> signifie que le bit de signe est décalé avec le reste du nombre plutôt que d'être laissé seul         valeur >>> = 7;         si (valeur! = 0)             temp         writeByte (temp);      while (valeur! = 0);

Topics and keywords

Themes: Serveur minecraft

License & attribution

License: CC BY-ND 4.0.

Attribution required: yes.

Manifest: https://tutos-gameserver.fr/llm-endpoints-manifest.json

LLM Endpoints plugin version 1.1.2.