1. Le forum de Minecraft-France va définitivement fermer ses portes. Celui-ci restera en lecture seule mais vous ne pourrez plus y apporter de nouveaux topics. Nous vous invitons à nous rejoindre sur le Discord de Minecraft-France qui permet de présenter vos projets, discuter avec la communauté etc.. Merci à tous d'avoir fait vivre ce forum de nombreuses années. Pour nous rejoindre sur Discord, Cliquez ici

Résolu Player Riding detect/ mob death detect

Discussion dans 'Commands blocks & Redstone' créé par Xgrps, 14 Nov 2015.

  1. Xgrps

    Xgrps Mineur

    Inscrit:
    28 Mai 2014
    Messages:
    471
    Points:
    81
    Sexe:
    Homme
    Bonjour à tous,

    J'ai ici deux petits problèmes qui me hante depuis un petit moment. (ce qui est assez rare je doit l'avoué)

    Mon premier est comment détecter un joueur qui ride une entité MAIS avec le Tag Passagers de la 1.9 j'ai déjà essayé plusieurs variantes de cette commande:
    Code (cpp):
    /scoreboard players tag @e[type=MinecartRideable] add ridden {Passengers:[{id:"Player"}]}
    mais le jeu ne détecte pas l'entité "Player" donc y a t-il une autre solution ?

    Mon second est comment détecter la mort d'une entité ou plutôt d'un mob pour par la suite exécuter une commande comme faire apparaitre un cadavre/ossements ? (ces dernier sont summon et donc ne spawn pas naturellement)

    J'ai déjà essayer de mettre les tags comme {Health:0s}, {DeathTime:0s} ou {Health:0.1f} mais aucun ne marche "réellement" :/

    Donc, j'ai essayer de faire en sorte qu'ils soit rider par une ArmorStand qui une fois au sol suite à la mort de notre mob une commande est exécuter sur l'ArmorStand ce qui n'est pas top vu qu'il y a le délai ou l'ArmorStand tombe au sol et où rien ne ce produit. donc y a t-il une autre solution ?

    Peut être que certaine personne comme @Redz, @Calambiel, @Mlakuss ou autre qui ne me viennent pas en tête le serait =) ?
     
    • Optimiste Optimiste x 1
    #1 Xgrps, 14 Nov 2015
    Dernière édition: 14 Nov 2015
  2. Calambiel

    Calambiel Résident de l'End

    Inscrit:
    5 Août 2014
    Messages:
    6 595
    Points:
    229
    Pour ta première question : tu peux aussi utiliser les nouveaux /scoreboard tags pour identifier ton joueur plutôt que par son id. Si ça ne marche toujours pas, il va falloir se rabattre sur un execute autour du joueur avec un rayon de 0 ou 1.
    Je ne sais pas encore très bien comment fonctionne le Passengers, mais sache qu'en 1.8 on pouvait détecter un joueur en Riding, donc il n'y a pas de raison qu'on ne puisse plus en Passengers.

    Pour la seconde : une entité morte n'est malheureusement plus détectable, il faut passer par un Passenger. Mais tu peux toujours changer le Motion de ton ArmorStand pour qu'il tombe plus vite au sol, ou faire une espèce "d'inhibition" entre les entités.
    Je m'explique : l'entité au-dessus reçoit en permanence un score à 1, mais l'entité en-dessous par un execute lui remet son score à 0. Lorsque l'entité du dessous meurt, elle n'est plus détectée et ne peut donc plus ramener le score à 0 : le score passe à 1, il suffit de s'arranger dans l'ordre des commandes pour que dés que ce soit le cas ton objet au sol apparaisse et que l'entité du dessus soit kill.
     
    • J'approuve J'approuve x 1
    • Informatif Informatif x 1
    • Utile Utile x 1
  3. Mlakuss

    Mlakuss Rédacteur

    Inscrit:
    7 Sept 2013
    Messages:
    1 694
    Points:
    180
    Sexe:
    Homme
    Pour détecter une entité morte, j'ai une solution qui passe par les loot tables si ça t'intéresse (bien sûr, si tu veux faire un module, ça ne sert à rien puisque c'est lié au monde)
    L'idée, c'est de faire looter à 100%, quelques soient les condition, un objet à ton mob et de faire un /execute sur l'objet.
    En pratique, créer un fichier .json avec ceci dedans:
    Code (cpp):
    {"pools":[{"rolls":1,"entries":[{"type":"item","weight":1,"name":"minecraft:stone_pressure_plate","functions":[{"function":"set_nbt","tag":"{doAnExecute:true}"}]}]}]}
    Mettre ce fichier json dans <sauvegarde>/data/loot_tables/minecraft.
    En jeu, faire pop ton entité avec la commande suivante:
    Code (cpp):
    /summon Zombie ~ ~ ~ {DeathLootTable:"minecraft:<fichier>"}
    Pour ton exécute, l'objet est une plaque de pression en pierre avec un tag "doAnExecute:true"

    Maintenant, si tu ne veux pas passer par l'ajout de fichiers, il est possible de faire en sorte que ton entité fasse tomber un poisson à chaque fois et de se servir de ce poisson.
    Code (cpp):
    /summon Zombie ~ ~ ~ {DeathLootTable:"minecraft:gameplay/fishing/fish"}
    Ça impose cependant de prendre des précautions si tu as des joueurs qui peuvent pêcher.

    Sinon, l'idée de l'armorStand sur ton mob me paraissait bonne.
     
    • Informatif Informatif x 1
  4. Xgrps

    Xgrps Mineur

    Inscrit:
    28 Mai 2014
    Messages:
    471
    Points:
    81
    Sexe:
    Homme



    Ok merci à vous deux :)
    Je fait les tests et je vous fait un retour.
     
  5. Xgrps

    Xgrps Mineur

    Inscrit:
    28 Mai 2014
    Messages:
    471
    Points:
    81
    Sexe:
    Homme
    En remplacent "Player" par sont tag ?
    mais ça peut pas marcher c'est pas une entité si ?

    /scoreboard players tag @e[type=MinecartRideable] add ridden {Passengers:[{id:"Player"}]}
     
  6. Calambiel

    Calambiel Résident de l'End

    Inscrit:
    5 Août 2014
    Messages:
    6 595
    Points:
    229
    Nope, je voulais dire détecter le passenger par son tag, pas par son id.

    Un peu comme ceci :
    Code (cpp):
    /testfor @e[type=MinecartRideable] {Passengers:[{Tags:["Nom_du_tag"]}]}
     
    • J'approuve J'approuve x 1
  7. Xgrps

    Xgrps Mineur

    Inscrit:
    28 Mai 2014
    Messages:
    471
    Points:
    81
    Sexe:
    Homme
    Non ça ne marche pas j'ai l'impression enfaite que le jeu ne détecte pas du tout l'entité "Player", j'ai essayé avec un Creeper et ça marche parfaitement.
     
  8. Skyrrel

    Skyrrel Enter the World

    Inscrit:
    10 Jan 2015
    Messages:
    21
    Points:
    39
    J'ai peut-être une solution pour le minecart, elle est plutôt complexe et je n'ai pas pris mon temps pour la compacté. ^^
    Code (cpp):
    scoreboard objectives add x stat.minecartOneCm
    Cette commande te permet de créer un nouveau scoreboard qui détecte quand un joueur monte dans un minecart, le joueur bouge un peu quand il monte dans un minecart.
    Code (cpp):
    execute @e[type=MinecartRideable] ~ ~ ~ execute @p[score_x_min=1,r=0] ~ ~ ~ scoreboard players tag @e[type=MinecartRideable,r=0,c=1] add ridden
    Cette commande détecte sur tout les minecarts si il y a un joueur qui à monter un minecart sur lui, si oui, le minecart reçoit le tag ridden.
    Code (cpp):
    execute @e[type=MinecartRideable,tag=ridden] ~ ~ ~ scoreboard players tag @p[score_x_min=1,r=0] add inMinecart
    Code (cpp):
    scoreboard players tag @a[tag=inMinecart] add notInMinecart
    Code (cpp):
    execute @a[tag=notInMinecart] ~ ~ ~ execute @e[type=MinecartRideable,r=0] ~ ~ ~ scoreboard players tag @p[tag=notInMinecart,r=0] remove notInMinecart
    Code (cpp):
    scoreboard players tag @a[tag=notInMinecart] remove inMinecart
    Ces commandes ajoute au joueur le tag inMinecart au joueur quand il est dans un minecart, et le retire son tag inMinecart quand il n'est plus dans le minecart.
    Code (cpp):
    execute @a[tag=inMinecart] ~ ~ ~ scoreboard players tag @e[type=MinecartRideable,r=0,c=1] add ridden
    Cette commande ré-ajoute le tag ridden au minecart quand le minecart détecte qu'il y a un joueur avec le tag inMinecart sur lui.
    Code (cpp):
    scoreboard players reset @a[score_x_min=1] x
    Code (cpp):
    scoreboard players tag @e[type=MinecartRideable,tag=ridden] remove ridden
    Ces commandes reset le système.

    J'espère que mon commentaire t'aidera pour ton système et je m'excuse pour l'explication brouillon de mes commandes. =3

    PS : J'ai modifié les commandes pour qu'elles s'adaptent à ta situation, désormais elles ne marchent que si le minecart est sur un armorstand. ^^
     
    #8 Skyrrel, 17 Nov 2015
    Dernière édition: 18 Nov 2015
  9. Xgrps

    Xgrps Mineur

    Inscrit:
    28 Mai 2014
    Messages:
    471
    Points:
    81
    Sexe:
    Homme
    Merci à toi mais ça ne pourra fonctionné car le minecart ride déjà une ArmorStand enfaite et donc le joueur ne feras pas bouger le minecart :)
     
  10. Skyrrel

    Skyrrel Enter the World

    Inscrit:
    10 Jan 2015
    Messages:
    21
    Points:
    39
    Le score augmente même quand il est sur un ArmorStand, je pense que c'est possible en changant les coordonnées relatives de mes commandes. :3

    PS : Le système fonctionne même quand le minecart est sur un ArmorStand, sauf qu'il faut changer tout les coordonnées relatives en "~ ~ ~, donc enlever tout les 1 et -1. ;p
     
    #10 Skyrrel, 17 Nov 2015
    Dernière édition: 17 Nov 2015
  11. Xgrps

    Xgrps Mineur

    Inscrit:
    28 Mai 2014
    Messages:
    471
    Points:
    81
    Sexe:
    Homme
    Ok je vais voir ça toute façon ça ma l'air bon au pire je réglerais ;)

    mais sinon j'ai peut être trouvé une autre méthode mais avec des bateaux :)
     
    • J'aime J'aime x 1
  12. Skyrrel

    Skyrrel Enter the World

    Inscrit:
    10 Jan 2015
    Messages:
    21
    Points:
    39
    J'ai oublié de dire qu'il fallait mettre les commandes dans l'ordre et qu'il faut les mettre sur une clock. x')
     
    • J'aime J'aime x 1
  13. Xgrps

    Xgrps Mineur

    Inscrit:
    28 Mai 2014
    Messages:
    471
    Points:
    81
    Sexe:
    Homme
    T’inquiète pas pour ça je suis pas un débutant x)
     
    • J'aime J'aime x 1
  14. Skyrrel

    Skyrrel Enter the World

    Inscrit:
    10 Jan 2015
    Messages:
    21
    Points:
    39
    Sinon ma solution marche ? :)
     
    • J'aime J'aime x 1
  15. Xgrps

    Xgrps Mineur

    Inscrit:
    28 Mai 2014
    Messages:
    471
    Points:
    81
    Sexe:
    Homme
    J'ai pas encore essayé j'ai pleins de chose a faire ^^
    Mais juste a lire comme ça oui ça devrait ;)
     
    • J'aime J'aime x 1

Partager cette page