Cet article fait partie d’une série servant à enseigner l’art du développement sur Minecraft. Vous pourrez retrouver l’introduction et le sommaire en cliquant ici.
Des nombres ! Plus de nombres ! Toujours pluuuus !
Bon, vous l’aurez compris, aujourd’hui nous allons apprendre à manipuler des nombres, appelés “scores”. Dans un jeu, les nombres, ça fait tout, même le café, donc s’ils vous donnent une allergie violente, passez votre chemin, la programmation n’est pas faite pour vous. Avec des nombres, on peut avoir la position et l’orientation d’un objet et/ou un joueur comme vu précédemment, mais aussi le nombre de blocs qu’il possède (et le type, si chaque type correspond à un nombre), et dans quel slot (chaque slot est associé à un nombre), ou encore sa vitesse ou ce qu’il a mangé le midi (quoique, à vérifier).
Dans Minecraft, les nombres (scores) sont rangés dans des tableaux (scoreboards). Chaque tableau possède un nom et contient la liste des entités avec leur nombre associé. Exemple :
Nombre d’ennemis tués |
|
TheFantasio974 |
999999 |
LeiRoF |
42 |
Oromis |
0 |
Slime |
0 |
KubbyDev |
-1 |
Ceci est la façon dont Minecraft permet d’afficher les scores (à droite de l’écran, vous en avez certainement déjà vu). Mais en réalité, pour manipuler les scores, il vaut mieux se représenter la chose dans ce sens:
LeiRoF |
|
Nombre d’ennemis tués |
42 |
Nombres de fois morts |
0 |
Points de vie |
1 |
Nombre de flèches tirées |
999999 |
Nombre d’alliés tués |
692 |
De cette façon vous aurez une vue d’ensemble sur une entité. Pour ceux qui ont déjà des notions de programmations, vous pouvez y voir ici un parallèle avec les objets. Chaque entité est ainsi un objet d’une classe “entité” dans laquelle vous pouvez ajouter autant de variables que vous voulez.
Bon, savoir comment les nombres sont stockés, c’est bien, mais comment modifier tout ça ?
Création
Il va y avoir 2 grand moyens d’accéder aux scores:
- Les accès en lecture qui permettront de prendre connaissance de la valeur de chaque score
- Les accès en écriture qui permettront de modifier ces scores
Mais avant ça, il faudra voir comment créer ces scores. Cette manipulation se fait via la commande
/scoreboard objectives add <nom> <type>
Deux scores ne peuvent pas avoir le même nom et ces noms ne peuvent pas excéder les 16 caractères. Le “type” d’un score représente globalement l’utilité de ce score. Il existe un nombre hallucinant de types différents, trop pour les lister, mais en voici quelques uns fréquemment utilisés:
- dummy: le plus fréquent, il s’agit d’un score simple sans utilité définie à l’avance. Juste un nombre sur lequel vous aurez un total accès.
- health: ce score prendra la valeur du nombre de demi-coeur que possède l’entité. Ce score s’actualise automatiquement lorsque la vie change et ne peut être accédé en écriture car il représente à tout instant la vie réelle de l’entité.
- minecraft.custom:minecraft.use.carrot_on_a_stick: oulà, celui là il fait peur, mais il ne sert en fait qu’à compter le nombre de fois qu’un joueur utilise l’item “carrot_on_a_stick” en faisant un clic-droit avec. Le score s’incrémente (augmente de 1) a chaque utilisation et peut être utilisé dans les systèmes de command block pour détecter le clic droit fait sur l’item. Il s’actualise automatiquement et peut également être accédé en écriture.
- trigger: tout comme le dummy, il n’a pas d’objectif précis, mais il a l’avantage de pouvoir être modifié directement par les joueurs eux-mêmes. Généralement, seul les joueurs OP peuvent exécuter des commandes et donc changer les scores. Celui là sera modifiable par quiconque aura la permission. Pour autoriser un joueur à modifier son score (une seule fois), il suffira d’entrer la commande:
/scoreboard enable <joueur> <nom du score>
Voilà, on a maintenant nos scores (aussis appelés objectifs), il ne reste plus qu’à les lire et les modifier.
Accès en lecture
L’accès en lecture à un score est assez simple : dans un sélecteur d’entité, précisez
scores={<NomDuScore>=<ValeurMin>..<ValeurMax>}
Exemple: say @e[scores={Tuto=2..6}] liste toutes les entités ayant un score “Tuto” compris entre 2 et 6 (inclus)
Il est également possible dans un exécute de comparer deux scores entre eux:
execute if score <Sélécteur1> <Score1> <Opérateur> <Sélécteur2> <Score2> run ...
Exécutera la commande si les deux scores respectent la condition imposée par l’opérateur. Parmi les opérateurs on retrouve:
- > : supérieur
- < : inférieur
- >= : supérieur ou égal
- <= : inférieur ou égal
- matches : égal (non, c’est pas juste “=” parce que… voilà.)
C’est tout, l’accès en lecture se limite à ça, et vous verrez que ça suffit amplement pour faire tout ce dont on désire.
Accès en écriture
Généralement, les modifications que l’on souhaite apporter à un score se résument à
- mettre ce score à une valeur précise
- ajouter une valeur à ce score
- retirer un valeur à ce score
Pour cela, il suffira d’exécuter la commande:
/scoreboard players <set | add | remove> <entité> <objectif> <montant>
Normalement, si vous avez bien suivi le guide, vous devriez comprendre assez facilement comment l’utiliser. Il est temps d’enlever les petites roues du vélo et d’arrêter d’expliquer le fonctionnement des commandes simples :p
Bon, mais si on veut faire des opérations plus complexes ? Des… mathématiques !
Additions, soustractions, divisions, multiplications et modulos, c’est également faisable !
Tandis que certains on déjà eu une grosse migraine du fait d’avoir lu “mathématique”, d’autres plus courageux se demandent ce qu’est ce “modulo”. Il s’agit tout simplement du reste d’une division (14 / 4 = 3 et il reste 2 car 4*3 + 2 = 14). Donc 14 % 4 = 2
Pour utiliser ces opérateurs, vous aurez besoin de deux scores (ou un score sur deux entités différentes).
Voici donc les différentes commandes à utiliser:
- /scoreboard players operation <entité A> <objectif 1> = <entité B> <objectif 2>
- /scoreboard players operation <entité A> <objectif 1> += <entité B> <objectif 2>
- /scoreboard players operation <entité A> <objectif 1> -= <entité B> <objectif 2>
- /scoreboard players operation <entité A> <objectif 1> *= <entité B> <objectif 2>
- /scoreboard players operation <entité A> <objectif 1> /= <entité B> <objectif 2>
- /scoreboard players operation <entité A> <objectif 1> %= <entité B> <objectif 2>
De cette façon, dans la première commande, l’objectif 1 de l’entité A prendra la valeur de l’objectif 2 de l’entité B (si vous n’avez pas bien saisi, prenez une minute pour réfléchir à cette phrase, elle a un sens important).
Pour éviter de devoir faire des grosses phrases incompréhensibles comme ça, on va simplifier les choses et considérer la commande suivante:
/scoreboard players operation (1) …= (2)
où (1) représente l’objectif 1 de l’entité A et (2) représente l’objectif 2 de l’entité B.
Dans le commande 2, (1) va prendre la valeur (1) + (2).
Dans la commande 6, (1) va prendre la valeur (1) / (6)
Je vous laisse deviner pour les autres…
En plus des opérateurs mathématiques, il existe 3 autre opérateurs:
- (1) > (2) : stocke dans le score (1) la valeur maximum présente dans le score (2), détenue par une entité du sélecteur (2)
- (1) < (2) : stocke dans le score (1) la valeur minimum présente dans le score (2), détenue par une entité du sélecteur (2)
- (1) >< (2) : inverse la valeur du score (1) et celle du score (2)
Conclusion
Avec tous ces opérateurs, vous pouvez désormais réaliser à peu près n’importe quel système. Ca peut aller d’un simple système d’économie (gestion de l’argent de chaque joueur) jusqu’à la création de fonctions mathématiques comme cosinus() ou log(), le tout décomposé et approximé par une série d’opérations de base. Il faut bien entendu avoir un niveau mathématique pour celà (niveau première/terminale S), mais avec ça, vous pourrez créer ce que bon vous semble: projectiles, véhicules et autres objets avec une physique réaliste, des IAs (oui oui, les IAs se basent beaucoup sur les mathématiques) etc.. Vous n’avez désormais plus aucune limite !