Difference entre 2 scoreboards

nico69

Architecte en herbe
23 Août 2011
159
21
124
Bonjour,

Je voudrais faire un système qui détecte lorsqu'une variable change de valeur.
Le système fonctionne parfaitement en solo, mais foire lamentablement quand il y a plusieurs personnes, mais je voudrais l'utiliser sur une map multi.

Voici comment je procède :
J'utilise 3 variables :
  • checkpoint : la variable a surveiller
  • lastCheckpoint : la valeur de checkpoint au précédent test (pas besoin d'etre tres rapide)
  • diffCheckpoint : checkpoint - lastcheckpoint
Je pourrais n'en utiliser que 2, mais ça ne change rien.
Voici les commandes utilisé dans l'ordre
  • /scoreboard players set @a diffCheckpoint 0
  • /scoreboard players operation @a diffCheckpoint -= @a lastCheckpoint
  • /scoreboard players operation @a diffCheckpoint += @a checkpoint
  • Test si diffCheckpoint != 0
Sur les scoreboard operation, le cmdblock me renvois
"[00:01:16] The entity UUID provided is in an invalid format"

Savez vous comment faire cela ? soit en débugant cette méthode, soit avec une autre.

Merci

Nico
 

The_MurmeX

In the beginning was a cookie...
4 Juin 2014
174
16
75
Es tu sûr que @a est possible pour les 2ème et 3ème commandes ?
J'ai l'impression que le problème viens de là: @a sous-entends qu'il s'agit de la scoreboard de tous les joueurs hors chaque joueur à une scoreboard qui lui est propre. Je sais que c'est un peu tiré par les cheveux mais les ordis sont un peu stupides parfois :D .
Si c'est vraiment ça qui cloche, il faudrait tester chaque joueur séparément.
En espérant t'aider.
 

nico69

Architecte en herbe
23 Août 2011
159
21
124
Faire chaque joueurs séparé n'est pas possible, car en final on fixera une limite physique au système.

J'ai fait quelques test et je suis tombé sur des résultats assez ... étranges.
/scoreboard players operation @a diffCheckpoint -= * lastCheckpoint -> somme le score lastCheckpoints (de toutes les entités) puis ajoute ce score aux joueurs connécté.
/scoreboard players operation * diffCheckpoint -= @a lastCheckpoint -> idem mais dans l'autre sens
/scoreboard players operation @p diffCheckpoint -= @a lastCheckpoint -> somme du score de tous les joueurs, qui est donné au plus proche.
/scoreboard players operation @a diffCheckpoint -= @a lastCheckpoint ou /scoreboard players operation * diffCheckpoint -= * lastCheckpoint -> error

Je pense que l'on peut utiliser une 4e variable et le @r pour ne sélectionner qu'une seule personne, mais la je ne trouve plus le système très fiable (surtout avec un nombre conséquent de joueurs).
Il faudrait un truc qui évite de sommer tous les scores et qui travail pour tous les joueurs en parallèle.

Ha je vient de voir la fonction test du scoreboard, il peut comparer 2 scores ?
 

The_MurmeX

In the beginning was a cookie...
4 Juin 2014
174
16
75
Je ne pense pas pour "test" (je crois c'est seulement des valeurs fixes) mais je teste.
Sinon j'avais pensé (Mais plus il y aura de joueurs moins se sera efficace) à crée une scoreboard "vu" (nom exemple) et faire:
  • /scoreboard players set @p[score_vu=0] diffCheckpoint 0
  • /scoreboard players operation @p[score_vu=0] diffCheckpoint -= @p[score_vu=0] lastCheckpoint
  • /scoreboard players operation @p[score_vu=0] diffCheckpoint += @p[score_vu=0] checkpoint
  • /scoreboard players add @p[score_vu=0] vu 1
Sauf que je viens de m'apercevoir que les joueurs bougeaient :D
 

nico69

Architecte en herbe
23 Août 2011
159
21
124
Ça rejoint l'idée du @r
A la place, on peut utiliser une id unique pour chaque joueur, qui diminue au cours du temps.
Lorsque l'id est a 0 (un seul joueur sera a 0), on lui fait l’opération et on le ramenne au max.
Le système a l'air stable, mais me parais très lourd a mettre en place, et moins efficace si il y a beaucoup de joueurs.
 

The_MurmeX

In the beginning was a cookie...
4 Juin 2014
174
16
75
De toutes façon, si tu veux,comme je le pense, exécuter une action sur un joueur dès que la scoreboard varie, tu n'as pas d'autre choix que de tester chaque joueur ou d'envisager toutes les valeurs de cette scoreboard (selon le cas ça peut être possible, mais bon si ta scoreboard peut aller jusqu'à 4562178 on va éviter :p )
 

nico69

Architecte en herbe
23 Août 2011
159
21
124
J'y ai pensé, mais je prévois que ce scoreboard prendra environ une 40aine de valeurs.
Actuellement, les valeurs sont changés au même endroit sur la map (un carré en 7*7), mais je ne me vois pas les mettre en ligne, d'ailleurs je ne pense pas avoir la place.
 

nico69

Architecte en herbe
23 Août 2011
159
21
124
J'ai trouvé !
J'avais oublié la commande execute ....
  • /execute @a ~ ~ ~ /scoreboard players operation @p lastCheckpoint -= @p checkpoint
  • test lastCheckpoint != 0
  • /execute @a ~ ~ ~ /scoreboard players set @p lastCheckpoint 0
  • /execute @a ~ ~ ~ /scoreboard players operation @p lastCheckpoint += @p checkpoint
bref résolu :p
 

The_MurmeX

In the beginning was a cookie...
4 Juin 2014
174
16
75
Je suis content que tu ais trouvé une solution ;) . C'est très bien pensé de ta part (J'avoue que là, je ne trouvais rien pour t'aider )