CommandBlock Afficher classement d'un scoreboard

ZaelChronicles

Joueur Lvl 1 :3
18 Août 2013
197
24
125
29
Situation : J’essaye d'afficher le Top 3 d'un scoreboard sur un panneau ! Comme ce panneau doit afficher un classement en prenant en compte les joueurs non connectés, j'utilise le @e car il est prévu que j’utilise des ArmorStand pour "sauvegarder" le joueur.

Problème : Ça ne fonctionne pas :'(

Code:
scoreboard players operation #best LaboRank > @e LaboRank
scoreboard players operation @e LaboRankCalcul -= #best LaboRank
data merge block ~ ~1 ~2 {Text1:'["",{"text":"1.","color":"white"},{"text":" ","color":"gold"},{"selector":"@e[limit=1,scores={LaboRankCalcul=0}]","color":"gold"},{"text":" -","color":"white"},{"text":" ","color":"gold"},{"score":{"name":"@e[limit=1,scores={LaboRankCalcul=0}]","objective":"LaboRank"},"color":"white"}]'}
tag @e[scores={LaboRankCalcul=0}] add LaboRankOK
execute as @e run scoreboard players operation @s LaboRankCalcul = @s LaboRank
scoreboard players operation #best LaboRank > @e[tag=!LaboRankOK] LaboRank
scoreboard players operation @e LaboRankCalcul -= #best LaboRank
data merge block ~ ~1 ~7 {Text2:'["",{"text":"2.","color":"white"},{"text":" ","color":"gold"},{"selector":"@e[limit=1,scores={LaboRankCalcul=0}]","color":"gold"},{"text":" -","color":"white"},{"text":" ","color":"gold"},{"score":{"name":"@e[limit=1,scores={LaboRankCalcul=0}]","objective":"LaboRank"},"color":"white"}]'}
tag @e[scores={LaboRankCalcul=0}] add LaboRankOK
execute as @e run scoreboard players operation @s LaboRankCalcul = @s LaboRank
scoreboard players operation #best LaboRank > @e[tag=!LaboRankOK] LaboRank
scoreboard players operation @e LaboRankCalcul -= #best LaboRank
data merge block ~ ~1 ~12 {Text3:'["",{"text":"3.","color":"white"},{"text":" ","color":"gold"},{"selector":"@e[limit=1,scores={LaboRankCalcul=0}]","color":"gold"},{"text":" -","color":"white"},{"text":" ","color":"gold"},{"score":{"name":"@e[limit=1,scores={LaboRankCalcul=0}]","objective":"LaboRank"},"color":"white"}]'}
execute as @e run scoreboard players operation @s LaboRankCalcul = @s LaboRank
tag @e remove LaboRankOK

Pour tester ce système, je suis accompagné d'un "ArmorTest", et je set à lui et à moi-même un score. Le soucis, c'est que mon panneau affiche sur les 3 lignes le même joueur, celui qui le plus haut score, que ce soit moi ou le ArmorTest.

J'ai trouvé la zone où ça coince grâce au retour des commandes blocs. Dans la commande ci-dessous (Pour choisir le 2ème et 3ème joueur), il m'indique que #best est égale au score du meilleur joueur, alors que celui-ci a reçu un tag pour l'exclure de la recherche :
Code:
scoreboard players operation #best LaboRank > @e[tag=!LaboRankOK] LaboRank
Pourtant, le sélecteur est bien placé sur l'entité, j'ai réalisé une CB faisant des particules à toutes les entités SAUF si elles possèdent ce tag en question.

Je ne comprends donc pas trop mon erreur x))
 

Eglaios

Crétin de la commu
14 Avril 2018
310
42
89
25
En fait, quand tu fais une opération avec un scoreboard, tu es obligé de cibler une seule et unique entité, il faut donc préciser "limit=1" dans les sélecteurs d'opérations... ce qui risque fort de rendre ta technique impossible

J'ai voulu tenter de mon côté et je t'ai monté une petite suite de commandes :

Code:
execute as @a[tag=!Ranked] at @a[tag=!Ranked] if score @p Score > @s Score run tag @s add Non_high
data merge block 9 1 -6 {Text1:'["",{"text":"1.","color":"white"},{"text":" ","color":"gold"},{"selector":"@a[limit=1,tag=!Non_high,tag=!Ranked]","color":"gold"},{"text":" -","color":"white"},{"text":" ","color":"gold"},{"score":{"name":"@a[limit=1,tag=!Non_high,tag=!Ranked]","objective":"Score"},"color":"white"}]'}
tag @a[limit=1,tag=!Non_high,tag=!Ranked] add Ranked
tag @a[tag=Non_high] remove Non_high

execute as @a[tag=!Ranked] at @a[tag=!Ranked] if score @p Score > @s Score run tag @s add Non_high
data merge block 9 1 -6 {Text2:'["",{"text":"2.","color":"white"},{"text":" ","color":"gold"},{"selector":"@a[limit=1,tag=!Non_high,tag=!Ranked]","color":"gold"},{"text":" -","color":"white"},{"text":" ","color":"gold"},{"score":{"name":"@a[limit=1,tag=!Non_high,tag=!Ranked]","objective":"Score"},"color":"white"}]'}
tag @a[limit=1,tag=!Non_high,tag=!Ranked] add Ranked
tag @a[tag=Non_high] remove Non_high

execute as @a[tag=!Ranked] at @a[tag=!Ranked] if score @p Score > @s Score run tag @s add Non_high
data merge block 9 1 -6 {Text3:'["",{"text":"3.","color":"white"},{"text":" ","color":"gold"},{"selector":"@a[limit=1,tag=!Non_high,tag=!Ranked]","color":"gold"},{"text":" -","color":"white"},{"text":" ","color":"gold"},{"score":{"name":"@a[limit=1,tag=!Non_high,tag=!Ranked]","objective":"Score"},"color":"white"}]'}
tag @a[tag=Non_high] remove Non_high
tag @a[tag=Ranked] remove Ranked

Voilà un peu le fonctionnement :
-J'utilise "Score" comme objectif de score [...]
1. Pour chaque joueur, la première commande ajoute le tag "Non_high" si un joueur a un score plus élevé que lui. En toute logique, seuls les joueurs ayant le score le plus élevé (ex-aequo aussi) n'auront pas le tag Non_high.

2. Le setblock du panneau. Le joueur à enregistrer est ciblé par le sélecteur @a[limit=1,tag=!Non_high,tag=!Ranked] : Pas de tag Non_high (donc meilleur score), pas de tag Ranked (à voir en 3), et je précise bien "@a[limit=1] plutôt que @p (à voir en 3)

3. Ajout du tag Ranked au joueur ciblé par le sélecteur @a[limit=1,tag=!Non_high,tag=!Ranked], comme la pancarte. Les joueurs avec le tag "Ranked" seront ignorés pour les autres places du classement.
Le sélecteur "@a[limit=1]" est très important : Si on le remplace par @p, en 2 et en 3, la commande 2 ciblera le joueur le plus proche du panneau, et la 3, le plus proche du bloc de commandes (à noter que tu peux toujours utiliser @p aux coords du panneau pour la commande 3).
On considère un joueur X et un joueur Y ayant un score Ex-aequo. En utilisant le sélecteur "@p" plutôt que "@a[limit=1]", Si X est plus proche du panneau et Y, des blocs de commande, le panneau affichera X, et les commandes détermineront "Y" comme déjà classé, ce qui peut entraîner plusieurs fois l'affichage de X sur la pancarte.
En revanche, "@a[limit=1]" ciblera toujours le même joueur (celui en jeu depuis le plus longtemps, je crois).

4. Le tag Non_high est enlevé à tous, permettant de recommencer un nouveau test pour chaque ligne du panneau.


Après avoir affiché le 3ème gagnant, on n'a pas besoin de lui donner le tag Ranked, vu qu'on n'affichera personne d'autre. à la fin, on enlèvera simplement les tags Non_high et Ranked, prêt pour recommencer un nouvel affichage.

Et vu qu'on cible seulement un joueur par ligne, les Ex-aequo seront pris en compte, et tout est bien qui finit bien!
(Le système ne prend en compte que les joueurs, et pas les autres entités)

En plus, cette méthode n'utilise aucun calcul : pas de scores en plus ni d'opérations, juste 2 tags, et les joueurs conservent leur score après l'affichage, alors tu peux le réutiliser.