J'essaie de créer une boule de neige qui déclenche une commande lorsqu'elle touche un joueur en 1.15, mais je ne sais pas comment faire. Lorsque je fais execute at @e[type=snowball] run gamemode spectator @a[distance=..2]
il n'exécute la commande que si elle passe juste à côté d'eux.
Réponse
Trop de publicités?Détecter où une boule de neige a touché un joueur ou un bloc est délicat. Vous ne pouvez pas faire quelque chose à la position d'une chose qui n'existe plus, une boule de neige n'obtient jamais la position OnGround
la direction de vue d'une boule de neige n'est absolument pas liée à sa direction de vol, ni même au déclenchement de l'avancement. entity_hurt_player
travaille pour elle.
Ce que vous devez faire à la place, c'est déplacer une entité fictive avec elle, vérifier sans cesse s'il y a toujours une boule de neige à proximité et, si ce n'est pas le cas, supposer qu'elle a touché quelque chose ou quelqu'un. Vous pouvez par exemple faire cela comme ceci (toutes les commandes sont exécutées à chaque tick) :
/execute as @e[type=armor_stand,tag=tracker] at @s run tp @s @e[type=snowball,tag=tracked,distance=..2,sort=nearest,limit=1]
/execute at @e[type=snowball,tag=!tracked] run summon armor_stand ~ ~ ~ {Tags:["tracker"],Marker:1,NoAI:1,NoGravity:1,Invisible:1}
/tag @e[type=snowball,tag=!tracked] add tracked
/execute at @e[type=armor_stand,tag=tracker] unless entity @e[type=snowball,distance=..2] run …
/execute as @e[type=armor_stand,tag=tracker] unless entity @e[type=snowball,distance=..2] run kill @s
Explication :
Il est plus facile d'expliquer ce système dans un ordre différent de celui dans lequel il se trouve, car cet ordre est fait pour la performance et la réactivité.
La deuxième commande crée un socle d'armure factice sur chaque boule de neige qui n'en a pas encore.
La troisième commande marque alors cette boule de neige comme une boule ayant déjà reçu son support d'armure factice.
La première commande continue de téléporter le socle de l'armure vers la boule de neige, tant que celle-ci existe encore.
La quatrième commande est celle qui vous intéresse vraiment : Lorsque le stand d'armure ne trouve plus de boule de neige à proximité, nous supposons que c'est parce qu'elle a été cassée par le sol, un joueur, etc. Vous pouvez exécuter n'importe quelle commande ici et cela se produira au dernier endroit où la boule de neige existait (donc toujours en l'air, pas exactement au niveau du bloc).
La cinquième commande supprime ensuite le support d'armure afin de ne pas avoir de nombreux supports d'armure inutiles qui traînent.
Questions et améliorations
- Dans mes tests, le rayon de 2m incluait toujours la boule de neige, même si elle tombait directement vers le bas. Mais il peut y avoir des cas qui font qu'elle vole plus vite (par exemple avec l'aide d'explosions) ou vous voulez aussi être capable de téléporter la boule de neige autour. Vous pourriez lier la boule de neige et le support d'armure de manière plus approfondie en utilisant des ID. Il peut s'agir d'un système d'ID personnalisé utilisant des tableaux de scores (des tutoriels à ce sujet peuvent être trouvés en ligne) ou de l'UUID de la boule de neige. Dans la version 1.16+, vous pouvez comparer l'UUID entier relativement facilement, dans la version 1.15- vous devez le réduire pour en obtenir des parties ou vous pouvez simplement espérer que vous n'aurez pas de collisions d'UUID si vous ne comparez que la moitié inférieure du nombre (parce que l'UUID est trop long pour être stocké dans un tableau d'affichage, donc vous obtenez un débordement, qui devrait normalement vous donner le même résultat seulement si le nombre original était le même, mais ce n'est pas garanti).
- La boule de neige pourrait également disparaître parce qu'elle est tombée dans le vide, a été enlevée avec
/kill
ou parce qu'il a volé en morceaux non chargés. Dans ces cas, vous ne voudrez probablement pas faire quelque chose à cet endroit. Il n'y a pas de bon moyen d'attraper tous ces cas, donc vous devrez les traiter individuellement, si vous voulez être aussi précis. - Si vous voulez être plus précis quant à l'endroit où la boule de neige a frappé (au lieu d'être en retard d'un tick), vous pouvez essayer d'enlever
Marker
,NoAI
etNoGravity
à partir du support d'armure et en copiant également laMotion
tag de la boule de neige à l'armure stand. Dans mes tests, cela a donné des résultats prometteurs, mais je ne suis pas sûr que cela fonctionnera toujours bien. Et bien sûr, vous devez retarder l'exécution de votre commande et la destruction du socle d'armure d'un tick, mais cela peut facilement être fait en déplaçant les quatrième et cinquième commandes au début de la chaîne.
Si cela ne fonctionne pas, vous pouvez essayer de déplacer le support d'armure "manuellement" (avec la téléportation) en fonction de la trajectoire de la boule de neige.Motion
étiquette. Vous pouvez également essayer la moitié de cette valeur, pour obtenir l'emplacement moyen de la portée où il aurait pu toucher quelque chose. Ou vous pourriez même faire une détection de bloc fantaisiste avec raycasting./tp
avec unfacing
est probablement utile pour faire tourner quelque chose d'une position à l'autre dans ce cas. - Vous pouvez également envisager des alternatives aux boules de neige. Par exemple, les flèches ont un
damage
que vous pouvez définir comme0
ils restent dans les environs après avoir atterri, ils déclenchententity_hurt_player
et ils ont un booléeninGround
et une balise complexeinBlockState
qui peut être utilisé pour de nombreuses choses.