CommandBlock [Version de votre choix] Détecter si un jouer regarde une certaine entitée

Legorel

Apprenti mapmaker
1 Mai 2019
7
0
1
Bonjour, je suis sur un projet de map qui contiendra différents effets selon l'entitée que le joueur regarde. Je n'ai rien trouvé sur internet sur comment je pourrai faire et je ne suis pas sûr que cela est possible. Vous pouvez m'aider sur n'importe quelle version étant donné que le projet n'est pas encore créé, je poursuivrai si une solution est trouvée, sur la version donnée.

Sur la photo avec le scoreboard à 137, j'aimerai détecter si l'entitée est visible par le joueur
open


Sur la photo avec le scoreboard à 96, j'aimerai détecter si le curseur du joueur est proche de l'entitée (ou carrément dessus)
open


Je vous remercie d'avance.
 

Eglaios

Crétin de la commu
14 Avril 2018
310
42
89
25
J'ai peut-être une idée... Avec un datapack, si à chaque tick tu invoques un area_effect_cloud à la tête d'un joueur qui sera téléporté de 1 bloc dans la direction où le joueur regarde, et ce jusquà ce que l'area_effect_cloud entre dans un bloc solide ou détecte une entité, ou atteigne une certaine distance (faudra rajouter des trucs pour détecter les différents mobs, vu que certaines hitboxes sont différentes...). La téléportation totale se ferait en 1 seul tick... Évidemment, les area_effect_clouds font très peu laguer (en fait simplement pas)
Après, si une entité valide est détectée, tu déclenches la fonction que tu veux faire pour cette entité-ci...
Oui, ça, ça se ferait, je crois bien
ça serait en 1.13 au moins, mais si tu veux faire ça en 1.14, ça serait faisable aussi

Si tu peux donner plus de détails sur ce que tu veux vraiment faire, je pourrais peut-être perfectionner ce système...
 

Legorel

Apprenti mapmaker
1 Mai 2019
7
0
1
Tout d'abord, un grand merci eglaios pour cette solution qui me parait possible mais je n'i connait rien en codage de datapack.
Mon objectif est de recréer le jeu SCP Containment Breach sur minecraft, j'ai donc besoin de faire le scp173 et le scp096.
scp173 ne bouge pas quand quelqu'un peut le voir et scp096 est hostile que s'il quelqu'un le regarde(en vrai c'est que si tu regarde son visage mais sa seras trop compliqué à faire.) si tu ne comprend toujours pas vas sur youtube et cherche scp 173 et scp 096.
 

Eglaios

Crétin de la commu
14 Avril 2018
310
42
89
25
J'imagine que ça pourrait se faire, surtout si tu n'as que 2 entités... Je suis vraiment débordé en ce moment mais je pourrais jeter un oeil
ça a l'air d'un jeu pas comme les autres!
En fait, je voudrais savoir si :
-Pour SCP 173, Il faut qu'il arrête de bouger du moment qu'il apparaisse sur l'écran du joueur, complètement, ou même partiellement?
-Pour SCP 096, ça serait juste son visage qu'il faudrait éviter?
 
Dernière édition:

Legorel

Apprenti mapmaker
1 Mai 2019
7
0
1
déjas je me suis renseigné et se que je cherche c'est du raycasting et il y â 3 méthodes pour le faire je vais pas m'atarder dessus. scp173 s'arrête même s'il est peut visible(donc je ferai dans la commande final r=3 je pense) et scp96 seras trop compiqué a faire si c'est par rapport au visage je ferais si le joueur le regarde entièrement. mais bon j'avance sur ma map je pense juste avoir besoin d'aide sur un système de génération aléatoire, je m'i connais bien en commandbloc sinon.
 

Eglaios

Crétin de la commu
14 Avril 2018
310
42
89
25
Comme truc d'aléatoire, le meilleur que je connais, ça serait le spreadplayers...
Sinon, il y a le @e[sort=random] avec des area_effect_cloud :
Mais au final, tu veux faire un système de blocs de commande? Avec la 1.13, mettre le plus que tu peux dans un datapack est très recommandé, tu as juste à mettre des blocs de commande pour call les fonctions ou faire les petites tâches et c'est beaucoup plus pratique, et, si bien utilisé, meilleur pour les fps
 
Dernière édition:

Eglaios

Crétin de la commu
14 Avril 2018
310
42
89
25
Ah? J'ai trouvé un truc très intéressant!
Le raycasting depuis le joueur, c'est pas très pratique vu que si tu ne veux pas qu'il voie à travers les blocs, tu dois kill le ray s'il a le tag InGround, donc si tu apperçois le SCP au coin d'un mur, ça risque de ne pas détecter la vision

Mais voilà ce que j'ai pensé : Faire le raycasting... depuis l'entité à proximité! Si tu invoques un area_effect_cloud sur l'entité, positioned eyes et facing entity @p eyes, puis que tu fais le raycasting, Soit le rayon heurte un mur et est supprimé, soit il heurte le joueur à la tête.

Dernier problème : cette méthode marche tout le temps... même quand le joueur ne regarde pas l'entité... La solution : faire un /kill des area_effect_clouds anchored eyes positioned ^ ^ ^1 avec distance=..1 depuis le joueur. De cette manière, les area_effect_clouds seront tués avant d'arriver au joueur s'il entre dans la "zone de kill", située pile dans le champ de vision du joueur.
Je vais peaufiner ça...
 

Eglaios

Crétin de la commu
14 Avril 2018
310
42
89
25
J'imagine qu'il n'y a qu'un seul SCP de chaque type, sinon? La map serait en multijoueur?
Pour le scp 173, il n'y a qu'à mettre 2 area_effect_clouds, un aux pieds et un à la tête...
 

Eglaios

Crétin de la commu
14 Avril 2018
310
42
89
25
Après quelques recherches, voici ce que j'ai fait! un truc ultra simple que tu pourrais utiliser sur SCP 096; Je l'ai réglé sur un zombie...
Bon, j'ai essayé de calibrer la vision de façon a n'activer le truc que lorsque le joueur regarde la tête...

ça ne nécessite qu'une commande de setup : "scoreboard objectives add Sight dummy"
Il faut aussi un fichier tag de blocs (par exemple renommé "nonsolid.json" dont voici le contenu :
Code:
{     
    "values": [ 
        "#minecraft:carpets",
        "#minecraft:banners",
        "#minecraft:buttons",
        "#minecraft:wooden_pressure_plates",
        "#minecraft:saplings",
        "#minecraft:rails",
        "minecraft:lever",
        "minecraft:air",
        "minecraft:torch",
        "minecraft:grass",
        "minecraft:tall_grass",
        "minecraft:dead_bush",
        "minecraft:fern",
        "minecraft:sunflower",
        "minecraft:lilac",
        "minecraft:rose_bush",
        "minecraft:vine",
        "minecraft:fire",
        "minecraft:poppy",
        "minecraft:dandelion",
        "minecraft:white_tulip",
        "minecraft:pink_tulip",
        "minecraft:red_tulip",
        "minecraft:orange_tulip",
        "minecraft:allium",
        "minecraft:blue_orchid",
        "minecraft:azure_bluet",
        "minecraft:oxeye_daisy",
        "minecraft:red_mushroom",
        "minecraft:brown_mushroom",
        "minecraft:wheat",
        "minecraft:potatoes",
        "minecraft:carrots",
        "minecraft:beetroots",
        "minecraft:sugar_cane",
        "minecraft:melon_stem",
        "minecraft:pumpkin_stem",
        "minecraft:nether_wart"
    ] 
}
Maintenant, pour mettre l'effet au mob, tu devras mettre cette commande en boucle dans la fonction tick :
Code:
execute as @#__Type d'entité que tu utilises comme SCP 173__# at @s facing entity @p feet positioned ~ ~1.63 ~ positioned ^ ^ ^0.75 run function #__Chemin de la fonction 2__#

Voici finalement le contenu de la fonction 2 :
Code:
tag @s[scores={Sight=101}] add Search
scoreboard players set @s[scores={Sight=101}] Sight 0
scoreboard players add @s Sight 1
execute positioned ~ ~-1.63 ~ as @a[distance=..0.15] at @s run summon area_effect_cloud ^ ^ ^1 {Tags:["PlayerSight"]}

execute positioned ~ ~-1.63 ~ if entity @a[distance=..0.15] positioned ^-0.3 ^ ^-1 if entity @e[tag=PlayerSight,distance=..0.65] run data merge entity @s {NoAI:1}
execute positioned ~ ~-1.63 ~ if entity @a[distance=..0.15] positioned ^0.3 ^ ^-1 if entity @e[tag=PlayerSight,distance=..0.65] run data merge entity @s {NoAI:1}
execute positioned ~ ~-1.63 ~ if entity @a[distance=..0.15] run scoreboard players set @s Sight 101
tag @s[scores={Sight=100}] remove Search
execute if entity @s[scores={Sight=..100}] positioned ^ ^ ^0.25 if block ~ ~ ~ #__chemin vers nonsolid.json__ run function __chemin vers cette même fonction 2__

Résultat : Tant que tu auras un contact visuel avec la tête de SCP 096, celui-ci aura automatiquement son NoAI mis à 0, et il sera remis à 1 lors que tu ne le regarderas plus ou qu'un bloc obstruera ta vision
Bon, c'est un peu un mélange des deux SCP, mais c'était juste pour montrer que c'était possible

La détection ne nécessite aucune entité en plus!
 

Legorel

Apprenti mapmaker
1 Mai 2019
7
0
1
je comprend pas toutes les commandes de ton système mais sinon tous les raycastings que je trouve sur internet sont quand le joueur clique avec un objet et moi je veut que ce soit en permanence mais du coup les systèmes ne marchent plus(l'entitée reste à une certaine distance du joueur). J'ai vraiment besoin juste d'un système pour avoir une entitée là où regarde le joueur et pas plus pour le moment pour commencer simple car le meilleur résultat que j'ai eu c'était:

-un armor stand est tp au joueur selon là où il regarde
-il avance(lentement)
-si un block est touché il se re tp au joueur selon le premier critère

se sytème est très lent est marchera pas sur scp 173.
je continu mes tests pour le moment.