CommandBlock Résolu Déclencher une action dans un rayon défini

Louqua

Bucheron
1 Novembre 2020
6
1
13
24
Bonjour !

Je créé ce p'tit sujet car je souhaiterai avoir de l'aide par rapport à une commande s'il vous plaît (étant complètement novice dans le domaine).

Lorsqu'un joueur s'approche d'une zone spécifique, je souhaite déclencher des dialogues/faire apparaître des monstres (en résumé déclencher une action).
Sauf que je ne connais pas la commande qu'il faut pour qu'une action se déclenche lorsque le joueur est situé à X bloc(s) autour du commande bloc.


Dans des version précédentes de Minecraft, il me semble que, dans mes souvenirs, les gens utilisaient le /testfor. Mais en voulant essayer cette commande, le commande bloc ne l'a reconnaissait pas, je me suis donc dit que cela avait du changer depuis (j'ai fait quelques recherches mais je n'ai rien trouvé qui correspond à ce que je souhaite faire).

Est-ce que vous savez comment faire ?
Merci d'avance !
 

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Hey !
Quel est le déclencheur de l'événèment ? Lorsque le joueur entre dans un certain rayon autour de coordonnées précises ?
 

Louqua

Bucheron
1 Novembre 2020
6
1
13
24
Le déclencheur serait le joueur, en fait je souhaite que lorsque le joueur entre dans un certain rayon autour du commande bloc, une action se déclenche (sans avoir besoin de marcher sur une plaque de pression ou d'activer un levier). Dans mes souvenirs, il me semble qu'Hypixel utilisait ce système dans ses maps aventures (notamment le manoir d'Herobrine ou le retour d'Herobrine je crois). Je ne sais pas si mes explications sont assez clairs, désolé si je m'exprime mal !
 

Gaël Erhlich

Installateur de radiateurs
21 Décembre 2014
1 544
382
217
Ici-même
Je pense pas que y'ait un autre moyen que de faire une horloge qui fait exécuter une action à tous les joueurs dans la zone souhaitée à chaque tour d'horloge. Genre avec une execute :
/execute as @a[distance=15] run [commande]
Je suis pas tout à fait sûr de la syntaxe parce que ça fait longtemps que j'ai pas fait de command block, mais voilà.
 
  • J'aime
Reactions: Oromis

Louqua

Bucheron
1 Novembre 2020
6
1
13
24
Je pense pas que y'ait un autre moyen que de faire une horloge qui fait exécuter une action à tous les joueurs dans la zone souhaitée à chaque tour d'horloge. Genre avec une execute :
/execute as @a[distance=15] run [commande]
Je suis pas tout à fait sûr de la syntaxe parce que ça fait longtemps que j'ai pas fait de command block, mais voilà.

Merci de ta réponse !

Je viens d'essayer la commande que tu as suggéré, elle est bien acceptée par le commande bloc, mais en revanche rien ne fonctionne. Par exemple, je souhaite faire apparaître un squelette dès que le joueur est à 15 blocs de distance, donc j'ai rajouté derrière run un summon. J'ai mis le "always active" pour que le commande bloc n'ait pas besoin de redstone mais cela ne fonctionne quand même pas. Aurais-je raté une étape ?

Voici à quoi ressemble la commande :

Code:
/execute as @a[distance=15] run summon minecraft:skeleton

EDIT : je crois avoir trouvé la commande exacte que je cherchais. Ce serait la suivante :

Code:
/execute as @a[x=,y=,z=,distance=] run summon...

Le souci que je rencontre maintenant, c'est que dès que je valide la commande dans le commande bloc, l'effet s'enclenche tout de suite après. Sauf que, quand je re rentre dans la zone autour du commande bloc (exemple 10 blocs autour), l'entité que je souhaite faire apparaître ne réapparaît pas. Elle apparaît uniquement lorsque je valide ma commande, mais lorsque je sors, puis rentre dans la zone à nouveau rien ne se passe, sauf si j'active le mode "repeat" mais ce n'est pas ce que je veux.

Pour renforcer mon explication je vais contextualiser la chose. Alors voilà : admettons que nous sommes dans une map aventure. Le joueur arrive devant la porte d'un château fort, et lorsqu'il commence à entrer, un commande bloc placé non loin de lui s'active et fait apparaître un garde (car le joueur sera rentré dans une zone X bloc autour du commande bloc). Et bien c'est ça que je souhaite qu'il se produise, même chose en cas de dialogue avec le /tellraw. J'ai tenté de déco/reco du monde, mais le command bloc ne s'activait plus, alors que justement, je souhaite qu'il se réactive. Admettons j'installe un command bloc dans une map, il va s'activer pour moi, mais lorsqu'un autre joueur jouera à la map, rien ne se passera, ou si ? En gros je souhaite qu'il s'active mais pas pour moi lorsque je fais l'installation de la programmation. Cependant je souhaite que son activation soit unique, et qu'il ne se réactive plus après. Par exemple si un joueur passe par un chemin qui fait spawn deux monstres, je ne veux pas que si le joueur revient sur ses pas, les monstres réapparaissent une seconde fois. Désolé si je suis pas très clair je dois sûrement mal m'exprimer !
 
Dernière édition:

Gaël Erhlich

Installateur de radiateurs
21 Décembre 2014
1 544
382
217
Ici-même
Les paramètres des command blocks fonctionnent pas comme tu crois.
Explication qui pourra sûrement servir à d'autres :

Type de command block (à gauche) :

- Impulse : la commande est exécutée à chaque "impulsion". C'est-à-dire qu'à chaque fois que tu envoies un signal de redstone, la commande est exécutée. Si tu désactives "Needs redstone", le command block lit plus les impulsions et il fait plus rien du tout après avoir exécuté la commande quand tu as rentré celle-ci.

- Chain : La commande du command block est exécutée à chaque fois que celui d'avant est activé. Si t'en mets plein les uns à la suite des autres, ça fait une chaîne de command blocks. Avec ça, tu peux par exemple mettre plusieurs command blocks sur la même horloge de redstone ou les faire toujours s'exécuter en même temps.

- Repeat : Le command block spamme la commande tant qu'il est actif.
Conditionnalité (au milieu) :
Aussi loin que je sache, ça sert que pour le type Chain.

- Conditionnel : Le command block n'exécute sa commande que si celui qui le précède a pu exécuter sa propre commande correctement. Par exemple, si le command block précédent contient la commande "/kill @e[type=zombie]" mais que y'a aucun zombie parce qu'on est en difficulté paisible, la commande aura échoué et le ton command block (le suivant) n'exécutera pas sa commande.

- Inconditionnel : Quelque soit le résultat de l'exécution de la commande du command block précédent, ton command block va exécuter sa commande juste après. Dans l'exemple d'avant, quand le command block d'avant va échouer à exécuter "/kill @e[type=zombie]", le tien (le suivant) va quand même exécuter sa commande.
Besoin de redstone (à droite) :

- Needs redstone : Le command block n'est actif que si il est alimenté. Pour les command blocks de type chain et repeat, ça veut dire que même si ils devraient s'activer par un autre moyen (respectivement l'activation du command block d'avant, et l'horloge du jeu qui s'active tous les 1 tick), le mode Needs redstone fera qu'il se passera rien sans qu'ils soient alimentés. Si tu mets "/say blabla" dans un command block repeat en mode Needs redstone et que tu mets un levier dessus, le command block spammera le tchat uniquement quand le levier est activé. Quand le levier est désactivé, rien ne se passe.

- Always active : Aucune contrainte d'être alimenté pour ce command block. (Choisir ce paramètre n'a de sens que pour un command block de type Repeat ou Chain)

Du coup, pour résoudre ton problème, t'as pas choisi les bons paramètres. Toi t'as fait Impulse + Always active, ce qui fait que la commande s'exécute une seule fois et puis c'est tout. Ce dont t'aurais besoin, c'est d'un command block qui spamme jusqu'à ce qu'il réussisse à exécuter sa commande et qu'il l'exécute plus jamais. Cependant, ce mode n'existe pas, donc tu dois bricoler. Tu peux par exemple mettre ta commande "/summon" dans un command block Repeat, et mettre par dessus un command block Chain conditionnel qui va empêcher ton command block Repeat de s'activer à nouveau. Puisque le Chain est en Conditionnel, il va s'activer que quand le Repeat réussira à exécuter ta commande, c'est-à-dire quand il aura trouvé un joueur dans la zone et qu'il fera apparaître le garde. Pour arrêter le command block Repeat, je vois 2 possibilités simples :
  • Mettre un tag au joueur qui vient de rentrer dans la zone et faire que le command block Repeat ne fasse attention que aux joueurs qui n'ont pas le tag en question. Dans ce cas, chaque nouveau joueur fera apparaître le garde.
  • Mettre le command block Repeat en mode Needs redstone, l'alimenter avec un bloc de redstone, et remplacer le bloc de redstone par de la laine (ou n'importe quoi d'autre). Dans ce cas-ci, le command block Repeat ne s'activera plus jamais après la première fois, sauf si tu remets le bloc de redstone (possiblement avec un 3ème command block).

Et pour empêcher le mécanisme de s'activer pendant que tu construis, tu peux ajouter un filtre pour que seuls les joueurs en mode survie ou aventure (en fonction de ce que t'as choisi pour ta map aventure) soient pris en compte par ta commande. Y'a un paramètre dans le sélecteur pour ça :
Code:
/execute as @a[x=,y=,z=,distance=10,gamemode=adventure] run summon...
Ou tu peux faire en sorte que la commande ne prenne en compte tous les modes sauf créatif :
Code:
/execute as @a[x=,y=,z=,distance=10,gamemode=!creative] run summon...
 
  • J'aime
Reactions: Louqua

Louqua

Bucheron
1 Novembre 2020
6
1
13
24
Merci beaucoup pour ta réponse !

Effectivement j'avais mal compris les fonctions du command block (c'est tout nouveau pour moi car il n'y avait pas ça dans les anciennes version donc je suis un peu largué !). En ce qui concerne les deux possibilités que tu me proposes, j'ai testé la seconde qui consiste en fait à mettre un bloc de redstone puis à le retirer (remplacer par de l'air) dès que la commande du repeat s'exécute. Et bien ça fonctionne ! Le monstre apparaît et le bloc de redstone se détruit bel ce qui désactive donc le repeat. Donc pour les mobs c'est bon !

Maintenant j'ai un dernier souci : j'ai testé cette solution pour des dialogues, mais ça fonctionne à moitié. J'ai ajouté un second repeat après le premier mais celui-ci je l'ai mis en conditionnel afin qu'il s'active uniquement si le précédent a envoyé sa commande (en l'occurrence "say test 1"). Le second est doit s'activer avec un bloc de redstone à côté de lui et est censé dire "test 2". J'ai mis deux chaines derrière. Le premier détruit le premier bloc de redstone et le deuxième le second bloc. J'ai testé comme ça et le "test 1" apparaît 3 fois et le "test 2" une seule fois.

C'est le même principe qu'avant, le joueur arrive dans une zone et des dialogues s'enclenchent. En gros avec un seul dialogue ça fonctionne mais ce que j'aimerai c'est faire plusieurs phrases qui s'enchaînent, comment je procède exactement ? Merci d'avance !
 

Gaël Erhlich

Installateur de radiateurs
21 Décembre 2014
1 544
382
217
Ici-même
Je suis pas trop sûr de comprendre quelle gueule a ton installation. Mais normalement, t'as pas besoin d'un deuxième Repeat si tu veux faire apparaître les textes en même temps que le garde. T'as besoin d'une seule ligne de command blocks avec 1 Repeat et autant de Chain que tu veux.

Code:
Repeat : /execute as @a[x=,y=,z=,distance=10,gamemode=adventure] run summon...
Chain #0 (Conditionnel) : remplace le bloc de redstone par de l'air
Chain #1 (Conditionnel) : /say text 1
Chain #2 (Conditionnel) : /say text 2
Chain #3 (Conditionnel) : /say text 3
Je suis plus exactement sûr de ce qui se passe si tu rends Chain #1 à #3 Inconditionnels, donc dans le doute j'ai mis Conditionnel. Mais tu pourras tester de ton côté pour voir si c'est vraiment nécessaire.
 
  • J'aime
Reactions: Louqua

Louqua

Bucheron
1 Novembre 2020
6
1
13
24
Je suis pas trop sûr de comprendre quelle gueule a ton installation. Mais normalement, t'as pas besoin d'un deuxième Repeat si tu veux faire apparaître les textes en même temps que le garde. T'as besoin d'une seule ligne de command blocks avec 1 Repeat et autant de Chain que tu veux.

Code:
Repeat : /execute as @a[x=,y=,z=,distance=10,gamemode=adventure] run summon...
Chain #0 (Conditionnel) : remplace le bloc de redstone par de l'air
Chain #1 (Conditionnel) : /say text 1
Chain #2 (Conditionnel) : /say text 2
Chain #3 (Conditionnel) : /say text 3
Je suis plus exactement sûr de ce qui se passe si tu rends Chain #1 à #3 Inconditionnels, donc dans le doute j'ai mis Conditionnel. Mais tu pourras tester de ton côté pour voir si c'est vraiment nécessaire.

C'est bon, ça fonctionne ! Merci beaucoup pour ton aide ! En espérant que cela puisse aider d'autres personnes ! :merci
 
  • J'aime
Reactions: Gaël Erhlich