Résolu Comment détecter ce que regarde un joueur !

Sinon, voilà en gros le principe :
En fait, c'est une fonction qui se répète à des positions décalées jusqu'à ce qu'elles trouvent un truc valide

Exemple (je met les fonctions en majuscule, sans "path") :


-Exécuter la fonction "RAYCAST" (juste en dessous)
Code:
/execute as @p at @s anchored eyes positioned ^ ^ ^1 run function RAYCAST

FONCTION "RAYCAST"
Code:
execute if entity @e[type=cow,dy=0] run say JE MATE LES VACHES!

execute unless entity @e[type=cow,dy=0] if entity @s[distance=..30] positioned ^ ^ ^.5 run function RAYCAST

Tout d'abord, le processus entier se déroule en un seul tick.
C'est un peu casse-tête, j'ai mis du temps à comprendre ce système lol

La fonction est exécutée en tant que le joueur ciblé, à sa position (yeux), avec le ^ ^ ^1. La première commande de RAYCAST teste donc s'il y a une vache dont la hitbox touche la position susdite.

Ensuite, si aucune vache n'a été détectée, la seconde commande s'active! Celle-ci réexécute la fonction en ^ ^ ^.5.
Comme la fonction a été exécutée avec "as @p", il s'agit donc d'une position relative au regard du joueur.
Étant actuellement positionné en ^ ^ ^1, le prochain cicle sera exécuté en ^ ^ ^(1 + 0.5) par rapport au joueur.
Aucun "as" ou "at" n'est redéclaré : la fonction sera donc toujours réexecutée en tant que le même joueur, avec des positions décalées
La fonction est donc réexécutée par elle même (aaargh), en tant que @s et positionnée en ^ ^ ^1.5 par rapport à celui-ci.
Si le test est toujours infructueux, le même processus que l'étape 1 se répète.
Toutefois, j'ai ajouté une limite : la deuxième commande ne se réactive pas si le joueur se trouve à plus de 30 blocs de la position actuelle de détection.
Sans cette limite, le jeu va répéter la fonction jusqu'à ses propres limites, un gros coup de lag...
Évidemment, pas de réexécution = processus fini pour le tick actuel.
 
  • J'aime
Reactions: WorldWideWeb_
@Eglaios J'ai tout compris merci bien, maintenant moi j'ai une question comment faire pour annuler le faite que ça cherche dans une zone, en gros que quand je vise une vache ça mette le message, mais quand je la vise pas ça fais rien...
 
J'ai pas trop compris, tu veux pouvoir exécuter une commande une seule fois au moment où on vise l'entité et que ça arrête le système ensuite ?
Pour que ce soit plus clair, ici on ne cherche pas vraiment dans une zone mais sur une demie-droite, directement dans la ligne de vue.
 
@Régis Laspalès Oui voila, je ne veux pas une zone mais faire en sorte qu'on vide (uniquement avec le curseur) l'entité, soit le villageois dans le contexte c'est uniquement pour faire en sorte que quand le villageois est visé, son scoreboard passe à 1 mais sinon son scoreboard est à 0
 
Yo

Ton raycasting cherche dans une zone? Tu utilises la bonne méthode?
Peut-être quelque chose genre oubli du "anchored eyes" ou truc comme ça...
Elle s'étend jusqu'où la zone?

Sinon pour le dy=0, ça marche finalement? Je peux pas vérifier avant demain...

Rajoute un /particle ~ ~ ~ dans ton système pour voir où sont les positions de détection juste au cas où

Aaah non c'est ce que Regis disait? En fait j'ai pas trop compris :dsl:
La honte :(
 
Dernière édition par un modérateur:
J'ai ça qui est activé tout les ticks

Code:
execute as @p at @s anchored eyes positioned ^ ^ ^1 run function flay:raycastvillager

Ensuite :

Code:
execute if entity @e[type=minecraft:villager,name=Filmin,dy=0] run say test
Code:
execute unless entity @e[type=minecraft:villager,name=Filmin,dy=0] run function flay:raycastvillager

Ça c'est dans ma fonction "raycastvillager", mais ça ne fonctionne pas avec mon villageois, j'ai juste modifié l'entité et je lui est mis son nom "Filmin", vous pouvez m'expliquer si j'ai fais un erreur ou pas

@Eglaios & @Régis Laspalès
 
Dernière édition:
@Eglaios & @Régis Laspalès J'ai réglé mon problème, j'ai ajouté un "dx=-3" et ça fonctionne, il fallait préciser les coordonnées latérale...


Code:
execute if entity @e[type=minecraft:villager,name=Filmin,dy=0,dx=-3] run say test
execute unless entity @e[type=minecraft:villager,name=Filmin,dy=0,dx=-3] run function flay:raycastvillager

Voici la Zone ou mon texte s'affiche, c'est exactement ce que je voulais merci de votre aide, tout en sachant que le texte s'affiche uniquement si on vise le villageois qui s'appelle "Filmin" !

Les Blocks :
- Sponge Block ( C'est la Zone )
- Light Blue Wool ( Endroit ou le Villageois se situe )
- Orange Wool ( Endroit où mon Joueur se situe )


Zone.png


Merci encore de votre, ça m'a également aidé à comprendre plus de chose :)
 
J'ai juste quelque ajustement à faire, car parfois mon texte s'affiche alors que je ne veux pas, mais c'est pas bien grave je trouverais un alternative, encore merci !
 
Tu n'as pas de problème dans l'axe Z, perpendiculairement à ton schéma ?
Perso j'ai pas tout compris au comportement du dy/x/z faudra que je fasse mes tests.

Tu peux aussi mettre des nombres décimaux dans le sélecteur si tu as besoin d'ajuster davantage.