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

Command Block /stats - Introduction de l'abstrait dans les commandes

Discussion dans 'Tutoriels' créé par Mlakuss, 21 Mar 2015.

  1. Mlakuss

    Mlakuss Rédacteur

    Inscrit:
    7 Sept 2013
    Messages:
    1 695
    Points:
    140
    Sexe:
    Homme
    Bonjour, bonsoir et joyeuses pâques en fonction de quand, où et dans quel espace-temps vous lisez ceci.
    Vous lisez actuellement un tutoriel sur la commande /stats, une commande méconnue mais dont le potentiel n'attend que d'être dévoilé.
    Veuillez m'excuser par avance, mais il s'agit d'une commande difficile à visualiser car proche des maths (pas de screenshot possible). Le plus simple pour vous est de tester les commandes et de constater le résultat par vous même.

    * À quoi ça sert ?

    Parmi toutes les commandes à votre disposition, de nombreuses vont modifier un certain nombre de bloc, d'objet ou d'entité... Le /stats va vous permettre de savoir exactement combien ! Et quand je dis exactement, c'est que vous allez pouvoir récupérer ces informations pour pouvoir réaliser des tests ou des opérations (Maths Everywhere).

    * Plus précisément, qu'est-ce que vous pouvez connaître ?

    La commande stats permet de récupérer plusieurs critères:
    - Le nombre d'objet affecté par une commande (/clear)
    - Le nombre de bloc affecté par une commande (/fill)
    - Le nombre de joueurs/monstres/entités affectés par une commande (/testfor - Regardez l'application, /kill)
    - Le nombre d'itération d'une commande
    - Le résultat d'une demande (/time query <daytime/gametime>)

    * Chouette, mais ça fonctionne comment alors ?

    Syntaxe de la commande /stats
    Code (cpp):
    /stats block x y z set type joueur objectif
    OU
    Code (cpp):
    /stats entity @sélecteur set type joueur objectif
    x, y et z doivent être les coordonnées d'un bloc de commande contenant la commande dont on veut connaître le résultat ou @sélecteur doit ciblé un joueur dont on veut connaître le résultat des commandes qu'il utilise (*wink* pratique pour détecter de la triche *wink*)

    type correspond au type d'information que l'on veut récupérer.
    SuccessCount - Compte le nombre de fois où la commande est exécutée
    AffectedBlocks - Compte le nombre de blocs modifiés par la commande
    AffectedEntities - Compte le nombre d'entités touchées par la commande
    AffectedItems - Compte le nombre d'objets touchés par la commande
    QueryResult - Renvoi le résultat de la requête

    joueur correspond au nom du joueur à utiliser
    objectif nom de l'objectif à utiliser (Vous devez créer l'objectif au préalable)

    Si tout se passe bien, vous êtes largués.

    * Mise en pratique - Premiers pas

    Minecraft n'a pas de système de variable à proprement parler, on est donc obligé de bidouiller avec les objectifs et les joueurs.
    Si vous avez un peu de mal à comprendre, essayez de faire simple en créant un objectif statsResult de type dummy et en l'affichant, histoire de voir ce que vous faites.
    Code (cpp):
    /scoreboard objectives add statsResult dummy Résultat
    /scoreboard objectives setdisplay sidebar statsResult
    Et raisonnez de la manière suivante: un joueur = une variable quand on parle de l'objectif statsResult.

    Voici 3 exemples pour vous faire la main avec cette commande. Si vous voulez rester dans la théorie, foncez à la partie suivante. Pour les 3 exemples, vous devez avoir créé l'objectif statsResult indiqué ci-dessus.

    Si vous avez regardé comment je compte les joueurs dans mon tutoriel sur le testfor, vous avez certainement vu une commande un peu étrange. Voici comment le reproduire:
    - On veut compter un nombre de joueur, qui sont des entités. On utilisera donc le AffectedEntities en type.
    - On a besoin d'une commande affectant les joueurs. La commande la plus simple est le testfor puisqu'elle ne fait strictement rien outre compter les joueurs.

    On va donc placer un bloc de commande et mettre dedans la commande suivante:
    Code (cpp):
    /testfor @a
    Maintenant, il est temps d'utiliser le /stats
    Dans votre barre de chat, entrez la commande suivante en remplaçant x, y et z par les coordonnées du bloc de commande.
    Code (cpp):
    /stats block x y z set AffectedEntities Joueurs statsResult
    Pour que Joueurs apparaisse dans votre sidebar, vous devez au préalable lui assigner une valeur:
    Code (cpp):
    /scoreboard players add Joueurs statsResult 0
    Et.. voilà. Si vous activez le bloc de commande, vous pourrez voir sur votre droite "Joueurs 1" (sauf si vous êtes en multi).
    Vous pouvez changer la commande dans le bloc avec la suivante pour tester autre chose que les joueurs:
    Code (cpp):
    /testfor @e[type=Villager]
    Faites spawner quelques villageois à côté de vous puis appuyez sur le bouton. Le nombre devrait alors être égal au nombre de villageois (pour changer le "Joueur", refaites un /stats en changeant Joueurs par Villageois).
    Cet exemple est là pour montrer comment compter les objets de manière non destructive.
    Si vous faites un /clear sur quelqu'un, vous pouvz voir combien d'objet sont détruits, mais il est possible de préciser la quantité d'objet à détruire après la data value. Si vous mettez 0, ça ne détruira pas les objets ET vous obtiendrez le nombre.
    La méthode est similaire à celle évoquée dans l'exemple précédent, on remplace juste le AffectedEntities par un AffectedItems et la commande /testfor par un /clear <cible> <objet> -1 0 (-1 permettant de cibler toutes les data values).
    Regardez la sauvegarde en fin de post si ça vous intéresse vraiment, le circuit est présent dedans.
    Cet exemple est là pour l'utilisation du query (qui fonctionne avec le /worldborder aussi)
    Première étape, poser le bloc de commande dont on va récupérer le résultat et mettre ceci dedans:
    Code (cpp):
    /time query daytime
    query signifie que l'on va demander une valeur
    daytime signifie que l'on va récupérer l'heure actuelle (gametime permet d'avoir le temps de jeu total sur le monde)
    Ensuite, le /stats
    Code (cpp):
    /stats block x y z set QueryResult Ticks statsResult
    Lorsque vous activez le bloc, vous devriez obtenir alors une valeur entre 0 et 24000 dans votre sidebar.
    Maintenant, avec un peu de maths, on peut arriver à obtenir l'heure "réelle".
    On va pour ça créer des constantes permettant de convertir les ticks en heure (en jeu)
    Code (cpp):
    /scoreboard players set #offset statsResult 6000
    /scoreboard players set #tickHeure statsResult 1000
    Et maintenant, place au calcul.
    6000 ticks corresponds à midi en jeu, on va donc ajouter 6000 puis diviser par 1000
    On réalise donc les opérations suivantes dans l'ordre donné.
    Code (cpp):
    /scoreboard players operation Heure statsResult = Ticks statsResult
    /scoreboard players operation Heure statsResult =+ #offset statsResult
    /scoreboard players operation Heure statsResult =/ #tickHeure statsResult
    Il reste juste un cas à gérer: entre minuit (0:00) et 6:00. On va donc tester quand le score Heure est supérieur à 24 et, si c'est le cas, retirer 24.
    Code (cpp):
    /scoreboard players test Heure statsResult 24 30
    Si vrai (comparateur)
    /scoreboard players remove Heure statsResult 24


    * Donc, j'affiche des nombres, et maintenant ?

    Et bien vous allez pouvoir les réutiliser !
    Les habitués vous diront qu'en fait, il fallait utiliser une entité lambda servant à stocker les scores (dont le sélecteur aurait été mis à la place de "Joueurs/Objets/Ticks" dans les exemples) et il aurait juste suffit de faire un execute dessus. On aurait même fais un /stats sur l'entité pour vérifier que tout marche. Mais on va partir du principe que vous pouvez vous servir de comparateurs, que vous ne cherchez pas à réduire à tout prix la taille d'un circuit et donc, la commande la plus simple pour vous est la suivante:
    Code (cpp):
    /scoreboard players test Joueurs statsResult min max
    Où min et max sont les bornes inférieures et supérieures du test.
    Et en partant de là, vous pouvez faire ce que vous voulez en fonction des résultats du test.

    Je vous laisse une sauvegarde ici avec des exemples rapides, c'est toujours pratique.
    Télécharger la sauvegarde
    Y a tout un tas de pancarte que vous pouvez cliquer pour faire changer les valeurs.

    Le /stats n'est pas très compliqué, mais comme les effets ne sont pas/peu visibles, on a du mal à le comprendre. N'hésitez pas à poser des questions.
     
    • J'aime J'aime x 9
    • Informatif Informatif x 1
    #1 Mlakuss, 21 Mar 2015
    Dernière édition: 8 Avr 2017
  2. Calambiel

    Calambiel Modérateur

    Inscrit:
    5 Août 2014
    Messages:
    6 608
    Points:
    209
    Bon tutoriel.

    On peut aussi utiliser le QueryResult pour savoir où se trouve la worldborder par rapport au centre simplement en utilisant /stats sur un command block avec cette commande :
    Code (cpp):
    /worldborder get
    Pratique pour les UHC qui sont de plus en plus répandus ces temps-ci.....

    Le seul problème avec cette commande c'est qu'il faut mettre l'objectif à 0 pour qu'il puisse ensuite varier. Donc pour un nombre inconnu d'entités auxquelles on veut attribuer un score il faut pas mal de /execute :/

    Ça a au moins l'avantage de gérer autant de valeurs que de joueurs alors qu'avec le stockage on ne pouvait pas toujours prendre une valeur par joueur (enfin si mais ça compliquait grandement la tâche).
     
    • J'aime J'aime x 2
    • Informatif Informatif x 1
  3. Pikachu

    Pikachu Mineur

    Inscrit:
    26 Avr 2014
    Messages:
    393
    Points:
    89
    Sexe:
    Homme
    Très bon tutoriel, comme d'habitude !
    Je pense qu'il servira à beaucoup de personnes ! :3

    Il faudrait que tu réunissent tes tutoriels dans un seul gros post. <.3
     
  4. Mlakuss

    Mlakuss Rédacteur

    Inscrit:
    7 Sept 2013
    Messages:
    1 695
    Points:
    140
    Sexe:
    Homme
    Et le post épinglé en haut des tutoriels, il sert à quoi?

    Pour le query, j'ai mis l'exemple de la taille du monde dans la map téléchargeable. Il est aussi possible de récupérer la valeur d'une gamerule (même une custom). Ce serait génial si on pouvait changer les gamerules via le /stats: On aurait une système de variable plus simple.
     
    • J'approuve J'approuve x 1
  5. Pikachu

    Pikachu Mineur

    Inscrit:
    26 Avr 2014
    Messages:
    393
    Points:
    89
    Sexe:
    Homme
    D'ailleurs, comment t'as fait pour générer les 3 stats de minerais ?
     
  6. Mlakuss

    Mlakuss Rédacteur

    Inscrit:
    7 Sept 2013
    Messages:
    1 695
    Points:
    140
    Sexe:
    Homme
    Les trois stats ? Il n'y en a qu'une. Le comptage se fait via le /fill (puisque je ne remplace que les minerais de diamants, il n'y a que x blocs remplacés ou affectés ce qui devient le résultat de ma commande).
    Si tu parles juste du changement de motif, c'est deux commandes clones qui forment une boucle. Je fais passer la couche du dessus en dessous et je remonte tout d'un cran.
     
    • Informatif Informatif x 1
  7. Aerosmite

    Aerosmite Mineur de Fer

    Inscrit:
    18 Nov 2014
    Messages:
    615
    Points:
    86
    Sexe:
    Homme
    Super tutoriel ! Cette commande à un sacré potentiel :o Mais qu'entend-tu par le nombre d'itérations ? Et pour le scoreboard players test, le résultat s'obtient-il avec un comparateur ?
     
    • J'approuve J'approuve x 1
  8. Mlakuss

    Mlakuss Rédacteur

    Inscrit:
    7 Sept 2013
    Messages:
    1 695
    Points:
    140
    Sexe:
    Homme
    Les itérations, c'est le nombre de fois où ta commande est utilisée (cas du /execute par exemple). Une itération correspond à un tour de boucle en math.
    Pour le test, il faut en effet utiliser un comparateur.
     
    • J'aime J'aime x 1
    • Gagnant Gagnant x 1

Partager cette page