2 votes

Parler aux PNJs en mouvement dans Minecraft 1.13

Le contexte :

Afin de déclencher un message de chat "de" NPCs - disons des villageois - en s'approchant d'eux, j'utilise un bloc de commande répétitif toujours actif (A), un bloc de commande d'impulsion sensible aux signaux de redstone (B) et un comparateur de redstone entre eux, pointant de A à B.

enter image description here

Comme je veux laisser les PNJs libres, je ne peux pas utiliser de coordonnées absolues, donc ce que je fais actuellement est :

A: execute at @e[name=Gary] if entity @p[distance=..2]
B: execute at @e[name=Gary] run tellraw @a[distance=..2] "Hey!"

Ainsi, le message de chat "Hey !" apparaît une fois pour chaque joueur se trouvant à une distance inférieure ou égale à 2 pâtés de maisons d'une entité nommée Gary, dès qu'un joueur est détecté dans cet espace.


Question :

Puisqu'il est étrange que Gary parle aux personnes qui se trouvent devant lui ainsi qu'à celles qui se trouvent derrière lui, est-il possible de modifier les commandes de manière à ce que le centre de la zone dans laquelle les joueurs sont détectés (et dans laquelle les joueurs doivent se trouver pour recevoir le message) ne soit pas exactement à la position de Gary, mais à un bloc devant lui ?

enter image description here


Délibérations :

  • Si Gary se tenait toujours au même endroit, il serait facile d'utiliser des coordonnées absolues comme ceci :

    A: execute if entity @p[x=x_,y=y_,z=z_,distance=..2]
    B: tellraw @a[x=x_,y=y_,z=z_,distance=..2] "Hey!"

    x_, y_ et z_ étant les coordonnées souhaitées à 1 bloc devant Gary.

  • Depuis la version 1.13, il est possible d'utiliser la notation en forme de caret pour les coordonnées dans certaines commandes, ce qui en fait des coordonnées relatives en tenant compte de la direction de visualisation de l'exécuteur de la commande, mais il semble que les arguments du sélecteur de cible ne prennent en charge que les coordonnées absolues dans l'édition Java.

1voto

Fabian Röling Points 19325

Vous pouvez utiliser la notation en forme de caret ( ^ ) en execute positioned ce qui rend inutile l'utilisation de l x , y y z les sélecteurs de cible entièrement (sauf dans certains cas très particuliers). La commande dont vous avez besoin est celle-ci :

execute at @e[type=villager] positioned ^ ^ ^2 run tellraw @a[distance=..2] "Hey!"

En prime, vous pouvez vous débarrasser du comparateur (et aussi éviter que les joueurs qui entrent le rayon plusieurs fois reçoivent le message plusieurs fois) en plaçant cette commande après la première :

execute at @e[type=villager] positioned ^ ^ ^2 run tag @a[distance=..2] add heardVillagerTalk

et en modifiant la première commande en :

execute at @e[type=villager] positioned ^ ^ ^2 run tellraw @a[distance=..2,tag=!heardVillagerTalk] "Hey!"

Cela évitera le problème que rencontrait le comparateur, à savoir que les joueurs pouvaient entrer et sortir de la zone et recevoir le message à chaque fois.


Si vous utilisez un tableau d'affichage national dans votre carte, vous pouvez bien sûr faire de même. Disons que l'état 0 est avant d'avoir "entendu" le "villageois" "parler" et l'état 1 est après. Fais de cette commande la deuxième commande de la rangée :

execute at @e[type=villager] positioned ^ ^ ^2 if entity @a[distance=..2] run scoreboard players set $game state 1

Et faites en sorte que les deux ne s'activent qu'à l'état 0. Cela suppose que votre tableau d'affichage d'état s'appelle "state" et le support "$game".

AlleGamers.com

AlleGamers est une communauté de gamers qui cherche à élargir la connaissance des jeux vidéo.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X