1. Si vous venez d'arriver sur le forum et que vous êtes un peu perdus, cliquez ici !
    Rejeter la notice

Command Block Les formats de variables

Discussion dans 'Tutoriels' créé par Calambiel, 11 Oct 2015.

  1. Calambiel

    Calambiel Modérateur

    Inscrit:
    5 Août 2014
    Messages:
    6 601
    Points:
    219
    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 :p 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
     
    • J'aime J'aime x 6
    • Utile Utile x 3
    • Informatif Informatif x 2
    #1 Calambiel, 11 Oct 2015
    Dernière édition: 11 Oct 2015
  2. Crorax

    Crorax Mineur

    Inscrit:
    28 Sept 2014
    Messages:
    384
    Points:
    109
    Sexe:
    Homme
    Très bon tutoriel ! Et pas de problème pour mon aide :p :love:
     
    • J'aime J'aime x 1
    • Informatif Informatif x 1
  3. SpringStorm

    SpringStorm Enter the World

    Inscrit:
    13 Oct 2015
    Messages:
    25
    Points:
    1
    Sexe:
    Homme
    Bonjour :)
    La commande que je vais faire :
    /tellraw @p {"text":"Essaye de cliquer ici","clickEvent":{"action":"run_command","value":"/tellraw @p {\"text\":\"bonjour\",\"color\":\"blue\"}"}}
    Quand le jouer cliqueras sur ''essaye de cliquer ici'', le mot ''bonjour'' apparaîtra.
    Y a t-il une commande /testfor qui s'activerait quand le mot ''bonjour'' apparaîtra dans le chat ?
     
  4. Calambiel

    Calambiel Modérateur

    Inscrit:
    5 Août 2014
    Messages:
    6 601
    Points:
    219
    Je ne vois pas le rapport avec le topic mais bon x)

    Tu peux tout simplement mettre une commande de clic event plaçant un bloc de redstone activant un système où tu pourras mettre ce que tu veux.
     
  5. charon25

    charon25 Enter the World

    Inscrit:
    28 Jan 2015
    Messages:
    31
    Points:
    70
    Sexe:
    Homme
    Cool merci ^^ (je savais ce que signifiait les lettres, mais pas après quelles caractéristiques fallait les placer :p)
     

Partager cette page