Résolu [1.11.2] Plusieurs tags dans un sélecteur. Pas possible ?

BlueFuSion348

Architecte en herbe
9 Mars 2012
80
1
18
111
31
Salut, salut !

J’aurais jamais cru que le problème venait de là... j’ai cherché partout.
J'ai un souci avec les tags dans le sélecteur, le sélecteur ne respecte pas les tags attribués ou non aux entités visées.

Par exemple :
Code:
/execute @e[name=MR,tag=ZIGZAG,tag=!MOVE] ~ ~ ~ /setblock ~ ~2 ~ emerald_block
Là, le bloc se pose même si le tag ZIGZAG n'est pas attribué à l'entité ciblée... C’est problématique...



Autre exemple rien qu’en changeant de place les tags dans le sélecteur :
Code:
/execute @e[name=MR,tag=!MOVE,tag=ZIGZAG] ~ ~ ~ /setblock ~ ~2 ~ emerald_block
Là, le bloc se pose même si le tag MOVE est attribué...

Est-ce un comportement normal ? À croire que c'est uniquement le deuxième tag qui est pris en compte et que le premier est ignoré.

Y a-t-il un moyen de mettre plusieurs tags dans un sélecteur ?

Sinon je devrais remplacer les tags par des "execute detect", car avec des scoreboards il faudra déclarer à 0 chaque score pour les entités summon et ça me fait plus de CB (contrairement aux tags) car à ce que je sache on ne peut pas /summon une entité avec des scores directement attribués dans les NBT-tags (contrairement aux tags).

Merci d’avance :D
 
Dernière édition:

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Oui, effectivement, c'est uniquement le dernier tag qui est pris en compte ;)
Mais pas d'inquiétude ! Il y a un moyen alternatif de tester des tags ! :p
En effet, ces derniers sont enregistrés sous forme de liste dans les nbt de l'entité !
Tu peux donc faire ceci pour attribuer un score à ton entité :
Code:
/scoreboard players set @e mort 0 {Tags:["pris"]}
Dans ton cas :
Code:
/scoreboard players set @e[tag=!MOVE] mort 0 {Tags:["ZIGZAG"]}
Par contre, tu es obligé de passé par deux command blocks au lieu d'un pour ton setblock... :p
 
  • J'aime
Reactions: BlueFuSion348

BlueFuSion348

Architecte en herbe
9 Mars 2012
80
1
18
111
31
Merci :D

Oui, donc en fait la commande
/scoreboard players set @e[name=MR,tag=!MOVE] mort 0 {Tags:["ZIGZAG"]}
attribue un score aux entités n'ayant pas le tag MOVE (dans le sélecteur) et ayant le tag ZIGZAG (dans les nbt).
Puis via ce score propre à l'entité car respectant ses tags, je fais mon setblock avec. C'est ça ?

Mais le problème étant que j'ai simplifié le contexte dans l'exemple, et il n'y a pas de /setblock mais une attribution de tag, mes commandes ressemblent plutôt à quelque chose comme ça :

/execute @e[name=MONSTREJ,tag=!MOVE,tag=!MTICK1,tag=!MTICK2] ~ ~ ~ detect ~1 ~ ~ stained_hardened_clay 2 /execute @e[c=1,r=1] ~ ~ ~ detect ~3 ~ ~-1 stone 0 /execute @e[c=1,r=1] ~ ~ ~ detect ~3 ~-1 ~ stone 0 /execute @e[c=1,r=1] ~ ~ ~ detect ~3 ~ ~1 stone 0 /execute @e[c=1,r=1] ~ ~ ~ detect ~3 ~1 ~ quartz_block 0 /scoreboard players tag @e[c=1,r=1] add MJH

Dans cette commande, pour qu'une entité obtienne le tag MJH, il faut que son nom soit SANCTIFIÉ MONSTREJ, que ses tags correspondent, et que les blocs détectés soient présent.

Puis des blocs chain suivent cette commande :
/tp @e[tag=MJH] ~ ~1 ~
/execute @e[tag=MJH] ~ ~ ~ /clone 501 86 491 508 86 491 ~1 ~ ~
/execute @e[tag=MJH] ~ ~ ~ /scoreboard players tag @e[c=1] add MOVE
/execute @e[tag=MJH] ~ ~ ~ /setblock ~30 ~-1 ~ air
/execute @e[tag=MJH] ~ ~ ~ /setblock ~30 ~ ~ magma
[...]
/execute @e[tag=MJH] ~ ~-1 ~ /fill ~1 ~ ~ ~8 ~ ~ quartz_block
/execute @e[tag=MJH] ~ ~ ~ /scoreboard players tag @e[c=1[COLOR=#000000]] add MTICK1
/execute @e[tag=MJH] ~ ~ ~ /scoreboard players tag @e[c=1[COLOR=#000000]] add MTICK2[/COLOR][/COLOR]
/execute @e[tag=MJH] ~ ~ ~ /scoreboard players tag @e[c=1] remove MJH

Par la suite j'ai testé autrement, vu que j'ai compris que l'on ne pouvait pas placer 2 tags à la fois, j'ai fait ceci :

/execute @e[name=MONSTREJ,tag=!MOVE] ~ ~ ~ detect ~1 ~ ~ stained_hardened_clay 2 /execute @e[tag=!MTICK1,c=1,r=1] ~ ~ ~ detect ~3 ~ ~-1 stone 0 /execute @e[tag=!MTICK2,c=1,r=1] ~ ~ ~ detect ~3 ~-1 ~ stone 0 /execute @e[c=1,r=1] ~ ~ ~ detect ~3 ~ ~1 stone 0 /execute @e[c=1,r=1] ~ ~ ~ detect ~3 ~1 ~ quartz_block 0 /scoreboard players tag @e[c=1,r=1] add MJH

Mais là j'ai eu des bugs cosmiques, j'ai compris ce qu'il se passait : il suffit que l'entité possède le tag MTICK1, donc je pensais que la commande allait s'arrêter, mais en fait non, il suffit qu'une entité à qui j'ai rien demandé se trouvant à 1 bloc d'à côté, si cette entité non désirée, ne possède pas le tag MTICK1, c'est elle qui continuera la suite de la commande, et si par malchance - vu que ce n'est pas prévu - tout le reste de la commande lui correspond, quitte à même rebondir sur une voisine encore plus lointaine, celle là aura faussement le tag MJH, et c'est comme ça qu'il y aura un bug cosmique.
Donc j'ai annulé cette méthode.

Oui, donc faudrait-il 2 CB tout de même dans ce contexte ?
C'est-à-dire :
/scoreboard players tag @e[name=MONSTREJ,tag=!MOVE] add MJH {Tags:["!MTICK1","!MTICK2"]}
puis :
/execute @e[tag=MJH] ~ ~ ~ detect ~1 ~ ~ stained_hardened_clay 2 /execute @e[c=1,r=1] ~ ~ ~ detect ~3 ~ ~-1 stone 0 /execute @e[c=1,r=1] ~ ~ ~ detect ~3 ~-1 ~ stone 0 /execute @e[c=1,r=1] ~ ~ ~ detect ~3 ~ ~1 stone 0 /execute @e[c=1,r=1] ~ ~ ~ detect ~3 ~1 ~ quartz_block 0 /scoreboard players tag @e[c=1,r=1] add MJH2
puis en chain :
/tp @e[tag=MJH2] ~ ~1 ~
/execute @e[tag=MJH2] ~ ~ ~ /clone 501 86 491 508 86 491 ~1 ~ ~
/execute @e[tag=MJH2] ~ ~ ~ /scoreboard players tag @e[c=1] add MOVE
/execute @e[tag=MJH2] ~ ~ ~ /setblock ~30 ~-1 ~ air
/execute @e[tag=MJH2] ~ ~ ~ /setblock ~30 ~ ~ magma
[...]
/execute @e[tag=MJH2] ~ ~-1 ~ /fill ~1 ~ ~ ~8 ~ ~ quartz_block
/execute @e[tag=MJH2] ~ ~ ~ /scoreboard players tag @e[c=1[COLOR=#000000]] add MTICK1
/execute @e[tag=MJH2] ~ ~ ~ /scoreboard players tag @e[c=1[COLOR=#000000]] add MTICK2[/COLOR][/COLOR]
/execute @e[tag=MJH2] ~ ~ ~ /scoreboard players tag @e[c=1] remove MJH
/execute @e[tag=MJH2] ~ ~ ~ /scoreboard players tag @e[c=1] remove MJH2

Bon, c'est déjà mieux, c'est même parfait car ça devrait fonctionner sans bug :D
Ce qui m'embête tout de même c'est que ça me multiplie par 2 un certain nombre de CB. Le truc c'est qu'avec des "execute detect" ça peut fonctionner aussi mais ça va rallonger la commande et devoir physiquement rallonger le support physique de mes "IDs de blocs". Ou alors le faire avec des scoreboards car j'ai remarqué que là je peux en mettre autant que je veux des scores dans le sélecteur, certes ça prend de la place à l'écrit (mais moins que mes "execute detect") mais le problème (si c'en est vraiment un) je dois à chaque fois mettre à 0 le score des entités summon donc ça peut multiplier par 3 certains blocs... Enfin bref, je vais utiliser la méthode que tu m'as conseillé, 2 blocs ça va encore, mais ça me multiplie quand même une 30aines de bloc par 2, mais c'est déjà mieux que 6 CB par 2 (6x2x30=360 CB) car avant je faisais chaque "execute detect" dans un CB séparé avec un score qui s'incrémentait de 1, donc si les 5 commandes avait mis 5 de score, et bien un score pour d'autre actions était attribué, etc... De même, le coup du "c=1,r=1" m'a sauvé pour pouvoir compresser tout ça dans un seul CB car il y a longtemps ça bugait : quand il n'y a qu'une entité ça va, mais s'il y en a plusieurs, ceux qui ont réussis la commande faisaient réussir ceux ayant juste la dernière section de commande valide... Enfin bref, je ne vais pas raconter la genèse de ce que je fais non plus hein...

Merci :D
 
Dernière édition:

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Pour régler ton problème de possible entité à proximité, remplace ton r=1 (qui teste sur un cercle de diamètre 3 blocs) par un dy=1, qui est, je trouve, beaucoup plus précis vu qu'il test seulement sur le bloc où se trouve l'entité et non autour ;)
Ça te sauvera peut-être la mise ! :p
 
  • J'aime
Reactions: BlueFuSion348

BlueFuSion348

Architecte en herbe
9 Mars 2012
80
1
18
111
31
Waaaaw "dy=1" ! Ha oui ça m'ouvre carrément d'autres horizons là ! (Je le connais de nom, mais je croyais que c'était des coordonnées fixes...)

Donc comme ceci en 1 CB ça peut fonctionner alors :
/execute @e[name=MONSTREJ,tag=!MOVE] ~ ~ ~ detect ~1 ~ ~ stained_hardened_clay 2 /execute @e[tag=!MTICK1,dy=1] ~ ~ ~ detect ~3 ~ ~-1 stone 0 /execute @e[tag=!MTICK2,dy=1] ~ ~ ~ detect ~3 ~-1 ~ stone 0 /execute @e[dy=1] ~ ~ ~ detect ~3 ~ ~1 stone 0 /execute @e[dy=1] ~ ~ ~ detect ~3 ~1 ~ quartz_block 0 /scoreboard players tag @e[dy=1] add MJH

De plus, avec ce "dy=1" je n'ai même plus besoin de faire de "execute detect" quand j'y pense alors, c'est ce qu'il me fallait depuis un bon moment XD je peux mettre tout mon bazar de "IDs de bloc" directement dans les entités plus besoin de /clone mais un simple /entitydata qui actualise les tags des entités, et les entités qui testeront une info pas là, n'ont pas à se soucier de la non présence de l'info et de dérailler malencontreusement sur le bloc d'à côté si l'info est là ! ;)

Par-contre si je remplace tous les "detect" par des tags, et oui j'ai un compromis à faire, certaine case n'ont pas d'entité (la majorité potentielle dans une grille de 16x10), car ce sont des cases qui n’interagissent pas avec l'environnement, mais l’environnement qui agit sur elles via les "detect".
Le "dy=1" peut m'être vraiment utile, donc alors dans ce cas il faut que toutes les cases possèdent une entité (160). Ou alors je mixe un peu des deux avec des "detect" et des "tags". Maximum en moyenne ça peut tourner à 30 entités sur 160 cases, mais parfois, ça peut approcher 100, et comme il y aura un level editor, on peut monter à 160. Ça peut se rapprocher sans problème de 160, donc... à la rigueur je rempli la grille de 160 entités (ce que j'avais fait il y a longtemps, mais je me suis dit que je pouvais ne mettre que le minimum fonctionnel)...

A vrai dire 160 entités invisibles ça ne fait pas ramer quand ont ne les regardes pas de toute façon...
Mais après le projet que je fais, j'en ai un autre en tête et là, ce seront des scènes de plus ou moins 160 entités aussi mais il peut y avoir 6x6 scènes/écrans en même temps, donc si je mets des entités sur tous les blocs qui n'interagissent pas sur l’environnement j'en aurais pour... 5760 entités si pas dans les 10000... ça peut pas tourner... là il ne faudra que les entités fonctionnelles et mettre le maximum d'info en "bloc" et tester via "detect"...

Mais j'en suis pas encore à ce projet. Là maintenant, il n'y a que 160 entités ici...

J'aurais une question :
Techniquement, avoir 160 entités et gérer TOUT par tags, cela fait-il plus ramer que, d'avoir un certain minimum d'entité potentiel (mais tout de même 160 dans un cas extrême) et gérer TOUT par "detect" /fill et /clone et des tags aussi pour certain cas pour limiter les "detect", ou est-ce l'inverse qui prend plus de ressource pour Minecraft ???
Perso, je dirais que des attributions de tags en masse, feraient moins ramer que des /clone en masse... Même avec 160 entités constantes...
Qu'en penses-tu ?

Et encore merci ! :D

EDIT : D’ailleurs j'y ai pas pensé plus tôt, mais ceci peut marcher aussi en fait, même pas besoin de 2 CB pour l'autre méthode :
/execute @e[name=MONSTREJ,tag=!MOVE] ~ ~ ~ detect ~1 ~ ~ stained_hardened_clay 2 /execute @e[dy=1] ~ ~ ~ detect ~3 ~ ~-1 stone 0 /execute @e[dy=1] ~ ~ ~ detect ~3 ~-1 ~ stone 0 /execute @e[dy=1] ~ ~ ~ detect ~3 ~ ~1 stone 0 /execute @e[dy=1] ~ ~ ~ detect ~3 ~1 ~ quartz_block 0 /scoreboard players tag @e[dy=1] add MJH {Tags:["!MTICK1","!MTICK2"]}
 
Dernière édition:

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Je pense que les tags font moins laguer que les clones vu qu'il n'agisse pas "physiquement" sur le jeu ;)
Si je peux te donner encore une autre astuce pouvant peut-être minimiser le nombre d'entité par rapport à ce que j'ai lu/compris sur ton problème, c'est l'utilisation des tildes de l'execute !
En effet, on ne s'en sert presque jamais, pourtant, c'est très utile !
Un exemple (Oulala, photos spoiler de mon prochain tuto ! :p) :
Si je veux faire le test d'un joueur dans une zone carré ayant l'entité à l'origine du test au centre de notre zone :
Si je fais la commande
/execute @e[type=armor_stand] ~ ~ ~ testfor @p[dx=2,dz=2]

Je vais me retrouver avec un test dans ce carré rouge :


pyVmQFU.png


Or, si je modifie les coordonnées de l'exécute, ce qui a pour effet de modifier le point d'exécution de la commande relativement à l'entité
/execute @e[type=armor_stand] ~-1 ~ ~-1 testfor @p[dx=2,dz=2]
J'obtient ce résultat là :
f8pMpq5.png

Peut-être peux-tu t'en servir pour qu'une seule entité fasse le travail de plusieurs autres ;)[/quote][/quote]
 
  • J'aime
Reactions: BlueFuSion348

BlueFuSion348

Architecte en herbe
9 Mars 2012
80
1
18
111
31
Merci, cela confirme ce que je pensais sur les performances :)

Au fait, le "dy=1" ne fonctionne pas comme je l’espérais, il me sélectionne certes l’entité de la bonne case, mais aussi l’entité d’en haut... Donc, j’ai remarqué qu’un "dy=0" est mieux dans mon cas. D’ailleurs un "dz=0" ou un "dx=0" fonctionne aussi, ce qui est normal :p

Pour ce qui est des tildes, je connaissais, (De toute façon dans certain cas ça reste invariable, que ce soit la première série de tilds qui soient coordonnées ou la dernière, quand une série l’est l’autre ne l’est pas, après ça peut être très utile dans certaine situation) mais je ne crois pas que dans mon cas cela va minimiser le nombre d’entité, ça ne peut que les augmenter xD
De toute façon je n’aurais pas pu les utiliser avec des "detect". Car si l’entité se déplace en "fantôme" pour un "detect" à gauche, elle va être à gauche en "fantôme", et donc comment je la retrouverais "physiquement" à droite pour un "detect" en bas d’elle-même ? (À moins de pouvoir faire un dz=1 tout en ne prenant pas le block dz=0, mais ce n’est pas possible je crois de gérer comme ça un minimum/maximum depuis la position de la commande ? Mais de toute façon ça complexifierait inutilement la chose ><)

Peut-être peux-tu t'en servir pour qu'une seule entité fasse le travail de plusieurs autres ;)
C'est plus ou moins ce que je fais, le truc c'est que ce sont des détections différentes et simultanées faites pas les entités de ce qui se trouve autour d'elle, entités répondant à leur propre nom pouvant se trouver n’importe où et à n'importe quel nombre sur la grille de 16x10, détections en forme de + ou autre, pour chaque block.

Actuellement je fais comme ceci (bien évidemment ceci n’est qu’une seule commande) :
/execute @e[name=MONSTREJ,tag=!MOVE] ~ ~ ~ detect ~1 ~ ~ stained_hardened_clay 2
/execute @e[dx=0] ~ ~ ~ detect ~3 ~ ~-1 stone 0
/execute @e[dx=0] ~ ~ ~ detect ~3 ~-1 ~ stone 0
/execute @e[dx=0] ~ ~ ~ detect ~3 ~ ~1 stone 0
/execute @e[dx=0] ~ ~ ~ detect ~3 ~1 ~ quartz_block 0
/scoreboard players tag @e[dx=0] add MJH {Tags:["!MTICK1","!MTICK2"]}
Le fonctionnement en image sur une portion de 3x3 cases (sur les cases blanches il y a potentiellement des entités mais elle n’intéresse pas l’entité, vu qu’elle "detect" des blocs) :
1486049959-entite-physique-detect.png




Par contre, oui, si je ne fais plus de "detect" de block, mais que tout est en tags dans les entités, de plus il faudra donc une entité pour chaque case de la grille de 16x10, mais là oui ça peut fonctionner :
Comme ceci (les tags de ce qui étaient les blocs avant, auraient d’autre appellation bien sûr, mais je les garde pour exemple pour que ce soit plus clair en comparaison avec l’autre commande) :
/execute @e[name=MONSTREJ,[COLOR=#0080ff]tag=StainedHardenedClay2[/COLOR]] ~ ~ ~-1
/execute @e[dx=0,[COLOR=#0080ff]tag=Stone[/COLOR]] ~ ~-1 ~1
/execute @e[dx=0,[COLOR=#0080ff]tag=Stone[/COLOR]] ~ ~1 ~1
/execute @e[dx=0,[COLOR=#0080ff]tag=Stone[/COLOR]] ~ ~1 ~-1
/execute @e[dx=0,[COLOR=#0080ff]tag=Quartz[/COLOR]] ~ ~-1 ~
/scoreboard players tag @e[dx=0] add MJH {Tags:["tag=!MOVE","!MTICK1","!MTICK2"]}
Le fonctionnement en image :
1486049968-entite-fantome-tags.png


Voilà, c’est une autre façon de faire pour un même résultat, et je n'aurais pas put le faire sans le dy=0 et sans le truc pour les NBT.
De plus si j'utilise cette méthode, dans mes blocs "chain" il n’y aurait plus de /clone mais des /entitydata, donc il n’y aurait plus de /tp non plus, par contre il y aurait 160 entités constantes :p
Mais je vais plutôt continuer à utiliser la première méthode, j'ai déjà trop avancé avec, maintenant je peux continuer sans bug, il me fallait soit le "dy=0" ou soit le truc pour sélectionner plus de tags via les NBT pour me débloquer, j'ai eu les deux donc l'optimisation sera je pense optimale :D

Encore merci :D

Je passe en résolu ;D
 
Dernière édition:

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
(À moins de pouvoir faire un dz=1 tout en ne prenant pas le block dz=0, mais ce n’est pas possible je crois de gérer comme ça un minimum/maximum depuis la position de la commande ? Mais de toute façon ça complexifierait inutilement la chose ><;)
C'est possible :p
Enfin... En théorie... ^^"
Il suffirait de combiner le rm avec un dx, de cette manière, tu peux exclure un voire plusieurs blocs ^^

Sinon, pas de problèmes, ça fait plaisir de voir des problèmes un peu plus complexe que ceux que j'ai l'habitude de traiter dans cette section ^^
 
Dernière édition: