Souvent, lorsque je me promène sur les forums, je voit des personnes qui demandent de l'aide à propos de commande /testfor... mais dans 90% des cas, sachez que cette commande ne sert à rien.
J'exagère, mais pas beaucoup.
Quand est-ce que je peux utiliser un /testfor ?
Depuis Minecraft 1.8, avec le /execute, le testfor sert uniquement dans des cas assez spécifique: obtenir un courant de redstone servant à alimenter plus d'un bloc de commande en sortie lorsqu'un joueur rempli une condition spécifique ou lorsqu'on souhaite activer une séquence de commande de manière unique.
Une application un peu exceptionnelle: utilisation du /testfor pour compter un nombre de joueur.
Code (cpp):
/scoreboard objectives add Stats dummy
/scoreboard objectives setdisplay sidebar Stats
/setblock ~ ~ ~ minecraft:command_block 0 replace {Command:"/testfor @a",CommandStats:{SuccessCountName:"Joueurs",SuccessCountObjective:"Stats"}}
Exceptionelle dans le sens où la commande ne sert à rien (on se moque de l'output, donc pas besoin de comparateur) et tout ce qu'on veut, c'est savoir combien de joueur sont touchés par la commande.
Pourquoi ne devrais-je pas utiliser de /testfor ?
Le /testfor a un léger inconvénient, il faut le réinitialiser pour qu'il puisse servir à nouveau (soit par un blockdata soit en s'arrangeant pour que la commande exécutée après le testfor retire la condition nécessaire au testfor pour qu'il s'active, risqué dans le cas de systèmes pour du multi-joueurs) et il entraîne aussi une certaine latence dans les circuits. Avoir un /testfor dans un circuit implique aussi de devoir mettre un comparateur et de se préocupper des interactions possibles entre les différents blocs. Et personellement, je préfère ne pas mélanger redstone et bloc de commande à moins d'y être obligé (mes dernières maps comportent beaucoup trop de redstone à mon goût, je vise toujours à en mettre moins).
Si vous souhaitez tester lorsqu'une commande est exécutée avec succès, il existe aussi une méthode avec le /blockdata qui permet de ne pas avoir de redstone, mais un chiffre dans un scoreboard à la place (recherchez "CommandStats" pour plus d'infos).
Notez toutefois qu'un comparateur placé en sortie d'un bloc de commande, quelque soit la commande, permet toujours d'avoir le nombre de succès.
Comment remplacer un /testfor ?
Si votre commande contient une cible (@a, @r, @e, @p), au lieu de mettre /testfor @a[condition] puis /give @a, vous pouvez simplement utiliser un /give @a[condition]. Et si jamais vous veniez à avoir deux conditions différentes dans vos commandes (ex: /testfor @a[condition1], /give @a[condition2]), le /execute permet d'avoir ces deux conditions (/execute @a[condition1] ~ ~ ~ give @a[condition2]).
Dans le cas où les commandes n'ont pas de cibles, vous pouvez aisément en faire apparaître une avec un /execute.
Pensez aussi à ceci: le /execute peut exécuter une commande /execute : vous avez donc la possibilité de créer une infinité de condition au sein d'une même commande.
Hep, pour mes data-tags, je fais comment ?
Seules deux commandes peuvent tester des tags spécifiques chez un joueur, le /testfor et /scoreboard. Dans ce cas là, le testfor est la solution la plus simple à mettre en place mais, on rencontre très vite les limites du système (multijoueurs...). Les solutions à base de /scoreboard sont plus complexes, mais sont de loin plus efficaces. Ce que je fais, c'est que je considère un objectif pour chaque testfor à remplacer et tout les X temps (1/20è de seconde généralement), je vais mettre à 2 tout les joueurs qui correspondent à mes critère, retirer 1 à tout les joueurs ayant 1 ou plus et dire "ceux qui ont 1 ou plus correcpondent à mes critères" pour un objectif donné.
Exemple, si je teste un joueur prêt à se battre:
Code (cpp):
/scoreboard players set @a[condition] isReady 2 {tags équipement joueur prêt}
/scoreboard players remove @a[score_isReady_min=1] isReady 1
/tellraw @a [{text:"Les joueurs suivant sont prêt: "},{selector:"@a[score_isReady_min=1]"}]
Si j'utilise la valeur 2, c'est pour me laisser une marge de manoeuvre lorsque je déplace mes blocs de commande. L'avantage d'avoir un circuit comme celui-ci, c'est qu'on se retrouve avec des "résultats" différent pour chaque joueur contrairement au testfor qui va mélanger tout les résultats.
À l'avenir, dites vous que si vous êtes en train d'écrire "/testfor", essayez de voir s'il n'existe pas une autre solution pour le remplacer (comme un /execute): c'est probablement le cas et ça sera probablement plus efficace. ☺
Si vous souhaitez un peu d'aide sur le /execute detect, rendez-vous ici.