Bonjour à tous.
Aujourd’hui nous allons aborder un sujet certes simple mais extrêmement récurent dans beaucoup de sujets de support : les types de variables dans Minecraft et leur utilisation en jeu. En effet beaucoup de personnes pensent au premier abord que les variables peuvent prendre un nombre infini de valeur et qu’elles sont toutes stockées de la même façon.
Il me semble donc utile de faire un petit tutoriel afin de vous expliquer pourquoi cela est faux et quelles conséquences cela a sur le jeu. Je vais d’abord vous expliquer ce qui justifie la présence de plusieurs formats avant de faire un petit résumé des variables du jeu. Je précise qu’il ne s’agira pas ici d’une explication complète de l’informatique mais d’une approximation afin de vous faire comprendre pourquoi il existe plusieurs formats. Je ne suis pas développeur et je me limite à ce qui est visible dans nos commandes en jeu.
Le binaire et les variables :
J’espère que vous le savez tous déjà mais l’information en informatique utilise un système binaire ou de base 2 : c’est-à-dire que le stockage et la lecture des données utilise une succession de deux types d'informations. Physiquement cela se traduit sur un disque dur par une succession de trous (en parlant du principe de base, les SDD et autres disques récents étant différents) qui sont interprétés numériquement sous la forme de 0 ou 1.
Alors qu’est-ce que la base 2 et comment fonctionne-t-elle ? C’est un système de notation numérique comme notre base 10 habituelle… sauf qu’au lieu d’avoir 10 chiffres avant de rajouter un chiffre au nombre ici il n’y a que deux valeurs possibles : 0 et 1. Pour donner quelques exemples de conversion de la base 10 à la base 2 : 2 donnera 10, 3 donnera 11, 4 donnera 100, 9 donnera 1001 et 10 donnera 1010. Chaque 0 ou 1 représente ce qu’on appelle un bit.
Pour ceux qui sont intéressés voici un convertisseur en base jusqu'à 16 : http://wims.unice.fr/wims/fr_tool~number~baseconv.fr.html
Le bit représente l’unité de base de stockage à partir duquel sont créées nos variables et plus il y a de bit utilisés plus la variable peut contenir un chiffre élevé. Vous commencez à saisir ? Si ce n’est pas le cas alors je vais vous éclaircir sur un dernier point : chaque format de variable va utiliser un certain nombre de bits qui vont prendre une certaine place dans la mémoire
Hé oui afin de limiter la mémoire occupée par les variables que le système doit stocker il est attribué à chaque mémoire un nombre de bit précis. Par conséquent plus la variable contient d'informations plus elle va prendre de place. Il convient donc de limiter au maximum le nombre de bit utilisés par les variables. C’est pourquoi on créé plusieurs format de variable que peuvent utiliser les variables selon les valeurs qu’elles sont destinées à atteindre.
Les variables du jeu :
Dans le jeu nous avons un certain nombre de variable utilisées dans le langage Java : (Xenforo n'acceptant pas une notation en puissance, je noterais ces dernières avec "^") :
- Le byte (b) variant de -128 (-2^7) à 127 (2^7 - 1)
- Le short (s) variant de -32 768 (-2^15) à 32 767 (2^15 -1)
- L’integer (i) variant de -2 147 483 648 (-2^31) à 2 147 483 647 (2^31 - 1)
- Le long (l) variant de -2^63 à 2^63 -1 (les valeurs sont trop grandes pour que je les écrive ici)
- Le float (f) variant de -(2-2^-23)*2^127 à (2-2^-23)*2^127 (ce sont d'énormes valeurs), cette variable a l’avantage de pouvoir contenir des nombres non-entiers avec une précision de 2^-149
- Le double (d) variant de -(2-2^-52)*2^1023 à (2-2^-52)*2^1023, tout comme le float elle peut contenir des nombre-non entiers mais possède un maximum et un nombre de décimales supérieur avec une précision de 2^-1074
Nous n’aborderons pas les mémoires de type String ou les valeurs de couleurs. Si jamais vous tentez de donner une valeur supérieure au maximum alors elle reviendra à son autre borne. Par exemple si vous essayez de donner une valeur de 32 768 à un short (qui possède un maximum de 32 767) sa valeur passera à -32 768.
Bien que le format de variable le plus répandu dans une majorité de NBT tag soit le byte (b) certains tags assez récurrents utilisent d’autres types de mémoire. Voici ci-dessous un petit résumé des utilisations de chaque format :
- Byte : toutes les informations prenant peu de valeurs ou équivalentes à un true/false (Invisible, Marker, IsBaby, ignited, ExplosionRadius mais pas ExplosionPower qui est un integer, Invulnerable… la liste est très grande), les identifiants des objets ou des effets, le nombre pour une même case (Count), certaines informations de couleurs (CollarColor des loups, Color des moutons), le nombre d’objet dans une même pile) ou la data value d’un bloc (bloc dans une falling sand ou d’un inData d’une flèche, mais cependant pas pour les blocs tenus par des enderman qui eux sont en short)
- Short : comme compteur de temps pour des entités lorsque les valeurs sont restreinte (fuse d’un creepeur ou d’une TNT, life pour les falling sand, Fire pour les entités en feu, les AttackTime/HurtTime/DeathTime des entités, les BurnTime/CookTime/CookTimeTotal des fours, le Anger des Pigmen), pour les informations d’objet d’un item droppé au sol, des spawners, des blocs tenus par des endermen ainsi que la damage value des objets dans l’inventaire ou leurs informations d’enchantement
- Integer : les données « persistantes » des entités (Age/LifeTime/SkeletonTrapTime, MoreCarrotTicks), les coordonnées entières (X/Y/Z, APX/APY/APZ), les sous-types d’entité (Variant pour les chevaux, CatType pour les chats, Size pour la taille des slimes, mais cependant pas les Guardian/Elder guardian qui utilise le tag Elder de format byte), les tags de villageois ou les « temps » d’area effect cloud, la durée des effets de potions, les valeurs décimales de couleurs, les valeurs « additives » (DisabledSlots ou HideFlags)
- Long : sert quasi uniquement pour les UUID
- Float : les données avec des décimales comme la rotation ou les informations de taille ou d’expansion d’area effect cloud
- Double : d’autres données avec des décimales dont notamment les AttributeModifiers
Applications :
Bon certains doivent maintenant se demander : Pourquoi il nous raconte ça celui-là ? A quoi ça va nous servir tout ça ?
Il est vrai que si vous êtes habitués aux /summon et aux /give customs vous n’avez pas forcément eu à apprendre tous ces formats car le jeu sait attribuer les bons formats selon les tags utilisés. Néanmoins l’inverse n’est pas vrai. Pour ceux se demandant ce qu’est l’inverse ici : si vos /summon ou /give vont écrire une valeur aux tags il est également possible de "lire" ces valeurs et là vous aurez besoin de connaître les formats.
Voici un exemple avec un creeper possédant un Fuse modifié. Voici la commande pour invoquer ce mob :
Code (cpp):
/summon Creeper ~ ~ ~ {Fuse:200}
Lorsque vous voudrez vérifier le NBT tag du creeper avec un testfor ou un scoreboard (ici l’exemple utilisera le testfor par simplicité) vous serez probablement tentés d’utiliser la commande suivante :
Code (cpp):
/testfor @e[type=Creeper] ~ ~ ~ {Fuse:200}
Mais cette commande ne marchera pas ! Le jeu aura alors besoin du format de variable pour vérifier le tag qui sera indiqué par une lettre à la fin de la variable. La commande exacte est alors :
Code (cpp):
/testfor @e[type=Creeper] ~ ~ ~ {Fuse:200s}
Vous voici éclairés sur l’intérêt de connaître les formats de variables
Sachez tout de même qu’il existe certaines exceptions à cette règle où il ne faut pas indiquer de format quand bien même ce dernier est connu (SelectedItemSlot par exemple qui est un integer mais ne marchera pas si l’on place i après le numéro du slot testé).
Voilà ce sera tout pour aujourd’hui. J’espère que ce tutoriel était assez compréhensible pour la plupart d’entre-vous et qu’il sera utile comme explication dans les sections de support.
Je remercie chaleureusement @Crorax pour m’avoir éclairé sur les variables.
Si vous avez encore du mal à comprendre les formats de variables je vous renvoie vers openclassrooms où vous trouverez des explications extrêmement détaillées : (il s'agit ici de généralités en développement et l'application en java peut être différente, vous remarquerez d'ailleurs que certaines tailles de variables sont différentes de ce que j'ai cité précédement, les valeurs de ce tutoriel étant les bonnes valeurs issues du site d'oracle)
https://openclassrooms.com/courses/apprenez-a-programmer-en-c/un-monde-de-variables
https://openclassrooms.com/courses/apprenez-a-programmer-en-java/les-variables-et-les-operateurs
Pour connaître l’intégralité des tags et leur format je vous renvoie comme d’habitude vers le wiki anglais :
http://minecraft.gamepedia.com/Chunk_format
http://minecraft.gamepedia.com/Player.dat