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

Command Block Le /testfor - À quoi ça sert ?

Discussion dans 'Tutoriels' créé par Mlakuss, 10 Oct 2014.

  1. Mlakuss

    Mlakuss Rédacteur

    Inscrit:
    7 Sept 2013
    Messages:
    1 694
    Points:
    140
    Sexe:
    Homme
    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.
     
    • J'aime J'aime x 5
    • Utile Utile x 4
    #1 Mlakuss, 10 Oct 2014
    Dernière édition: 10 Oct 2014
  2. tipigeon

    tipigeon That's just like...Your opinion man
    Membre Premium

    Inscrit:
    15 Mai 2012
    Messages:
    4 208
    Points:
    234
    Sexe:
    Homme
    Merci, comme tout tes tutoriels il m'aide beaucoup!
    Je comprend enfin pourquoi mes testfor ne marchaient jamais plus d'une fois de suite xD
     
  3. desservaux

    desservaux Nouveau

    Inscrit:
    11 Avr 2013
    Messages:
    8
    Points:
    42
    Très bon tutoriel, tu aurais juste pu rajouter que les testfor pouvaient servir pour détecter quand un joueur win(détecttion tu dernier joueur vivant).
     
    • Mauvaise orthographe Mauvaise orthographe x 1
  4. Valtharen

    Valtharen Mineur d'Obsidiennes

    Inscrit:
    2 Mar 2014
    Messages:
    3 804
    Points:
    194
    Ça rentre dans la catégorie de détection d'objectives.
     
    • J'aime J'aime x 1
  5. Mlakuss

    Mlakuss Rédacteur

    Inscrit:
    7 Sept 2013
    Messages:
    1 694
    Points:
    140
    Sexe:
    Homme
    Plutôt dans la catégorie "Comptage de joueur" (les premières commandes du post), le /testfor est donc un moyen d'obtenir une valeur et est effectivement préférable.
    Je profite pour donner un petit conseil: il faut utiliser des faux-joueurs pour faire ce genre de compte.... mais rien ne vous interdit d'avoir une entité portant le nom de ce faux-joueur pour pouvoir faire un /execute @e[name=...].
     
  6. Kwizzy

    Kwizzy Enter the World

    Inscrit:
    20 Oct 2014
    Messages:
    39
    Points:
    13
    Sexe:
    Homme
    Je trouve ce tutoriel absolument somptueux !
    Bien joué tu m'as appris quelque chose que je ne voulais pas apprendre ... :@
    ;)
     
  7. Mrcubix17

    Mrcubix17 Bûcheron

    Inscrit:
    13 Mar 2014
    Messages:
    153
    Points:
    34
    Sexe:
    Homme
    Ne sert pas trop pour moi car je suis en 1.6 et que il n'y a pas le moindre commande /execute mais sinon très bon tuto
     
  8. Mlakuss

    Mlakuss Rédacteur

    Inscrit:
    7 Sept 2013
    Messages:
    1 694
    Points:
    140
    Sexe:
    Homme
    Sauf que si tu veux produire du contenu pour Minecraft, tu as fortement intérêt à passer en 1.8.
     
  9. toon99

    toon99 Nouveau

    Inscrit:
    9 Nov 2014
    Messages:
    3
    Points:
    10
    Sexe:
    Homme
    Bonjour Mlakus je suis, avec des amis, en train de creer une map pvp et j'ai un soussis je n arrive pas a detecter quansd il ne reste plus qu'un joueur qui est vivant. Sur cette map il n'y a pas d'equpes,tout le monde se combat. On a mis un scoreboard qui dit cb il te reste de vie et si il ne t en reste plus tu passe en gamemode 3.
    J'espere avoir était assez précis. Ce que je veux c'est détécter le dernier joueur vivant pour lui dire qu'il a win et ensuite tp tout les joueurs dans une salle de reset.
    ps:la map est en 1.8
    Merci d'avance
     
  10. Mlakuss

    Mlakuss Rédacteur

    Inscrit:
    7 Sept 2013
    Messages:
    1 694
    Points:
    140
    Sexe:
    Homme
    Là, tu as un des rares cas où le /testfor est utile (détecter une non-présence de joueur).
    Où tu fais quelque chose de "simple":
    /testfor @a[m=2] et avec un comparateur en sortie. Dès que ton signal vaudra 1 en puissance, alors, il ne reste plus qu'un joueur.

    Plus complexe, tu fais aussi le /testfor @a[m=2], mais tu lance une commande en plus sur le bloc:
    /stats block X Y Z set QueryResult Joueurs Compteur
    Avec Compteur un objectif de type dummy.
    La commande suivante te dira alors s'il y a exactement un joueur.
    /scoreboard players test Joueurs Compteur 1 1
     
  11. toon99

    toon99 Nouveau

    Inscrit:
    9 Nov 2014
    Messages:
    3
    Points:
    10
    Sexe:
    Homme
    Merci bcp tu me sauve la vie je vais essayer cela tout de suite
     
  12. Jbip

    Jbip Mineur

    Inscrit:
    31 Août 2013
    Messages:
    398
    Points:
    134
    Sexe:
    Homme
    Personnellement, je me sers du /testfor pour détecter un joueur dans une zone spécifique (qui, va ensuite déclencher un évènement). Je ne sais pas si je fais bien, mais ça marche niquel. :)
     
    • J'aime J'aime x 1
  13. toon99

    toon99 Nouveau

    Inscrit:
    9 Nov 2014
    Messages:
    3
    Points:
    10
    Sexe:
    Homme
    Oui c bon g réussi un grand merci a toi
     
  14. William1190

    William1190 Explorateur

    Inscrit:
    27 Avr 2012
    Messages:
    69
    Points:
    114
    Sexe:
    Homme
    J'adore des petits tutos sur minecrat comme ceci ;)
    Je me coucherai moins bêtes
     
  15. Avenbana

    Avenbana Bûcheron

    Inscrit:
    18 Avr 2015
    Messages:
    115
    Points:
    61
    Sexe:
    Homme
    Super tuto comme d´habitude
    Apres faut apprendre toutes les conditions et si possible les DataTag et ca je trouve sur aucun site :x
     

Partager cette page