Détection pluie sur joueur

Vivi5454

Aventurier
31 Mars 2020
13
1
3
34
Bonjour, après les infructueuses recherches et essais, je viens solliciter votre aide.

Je suis en train de créé un serveur java édition, j'aimerai que la pluie tue les joueurs qui ne soient pas protégé par un (ou plusieurs) bloc au dessus d'eux peux importe la hauteur tant qu'il sont protégé de la pluie...
Pour l'instant j'ai réussi a "contaminé" l'eau (type mer, etc...) mais si un joueur va dans l'eau, leffect est valable pour tout les joueurs alors que j'aimerais que ça sois que le joueur dans l'eau...

Je n'arrive pas me servir de exécute correctement et a trouvé de bon tuto idéalement en fr.

J'aimerais une aide pour ces commandes et j'aimerais aussi qu'on m'explique ce que l'on me dis si possible que je comprenne....

Merci par avance a tous !
 

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Hey !

Je ne peux malheureusement pas t'aider si tu ne me donnes pas tes commandes qui ne marchent pas (ou mal), ni la version sur laquelle tu joues ^^'
 

Vivi5454

Aventurier
31 Mars 2020
13
1
3
34
Pardon, effectivement ça serais mieux, je joue en 1.15.2.

Pour la commande : execute as @a at @s if block ~ ~2 ~ air

Ensuite ça active un deuxième command block : effect give @a "nausea par exemple"
 

Vivi5454

Aventurier
31 Mars 2020
13
1
3
34
Personnes ? Au pire existe t'il des mods qui rendrais la pluie toxique a votre connaissance ? Car j'en est pas vu ....
 

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Pour dans l'eau :
Code:
execute as @a at @s if block ~ ~ ~ water run effect give @s [...]
Pour détecter la pluie, c'est un peu plus difficile ^^"
Il va falloir que tu passes par un Data Pack, et plus précisément par un Predicate.
Pour les Data Packs, je ne vais pas expliquer, c'est assez simple à faire, par contre je te donne le prédicate en pièce-jointe.
Pour expliquer un peu les prédicats, il s'agit d'une condition à valider pour exécuter une commande (par exemple) !
Dans ce cas-ci, si tu ouvres le fichier, tu verras cela :
Code:
{
    "condition": "weather_check",
    "raining": true
}
Rien de bien compliqué, on défini une condition "weather_check" qui vérifie le temps, puis on lui dit de valider la condition s'il pleut ("raining": true).
Pour s'en servir :
Code:
execute if predicate [datapack]:raining run say Slime
Cette commande n'affichera "Slime" que si il pleut !
Le gros problème, c'est détecter s'il est dehors, et là, je ne vois pas d'alternative à tester tous les blocs au-dessus du joueur... :/
Pour cela, on invoque un armor_stand invisible sur le joueur, que l'on téléporte vers le haut tant qu'il n'a pas atteint la couche 256 (en 1 seul tick par récursivité).
Si il rencontre un bloc qui n'est pas de l'air sur son passage, il donne un tag "Outside" au joueur sous lui, puis se kill.
Si le joueur à le tag, alors on lui applique les effets !
 

Fichiers joints

  • raining.json
    54 bytes · Affichages: 122
  • J'aime
Reactions: FlyingDustman

Vivi5454

Aventurier
31 Mars 2020
13
1
3
34
Merci pour toutes ses informations, pour la détection de pluie, j'ai déjà un système Redstone qui marche très bien, avec l'armor stand ça va ciblée que les joueurs dehors ?
La technique la me plais bien mais je n'arrive pas a trouvé pour faire la commande la depuis qu'il n'y a plus testfor.....
 

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Dans l'idée :
  • Tu invoques sur chaque joueur un armor_stand invisible
  • Tu attribues au joueur et à l'armor_stand un ID unique (le premier joueur ciblé et l'armor stand invoqué sur lui auront 1, pour la deuxième pair ce sera 2...)
  • Tu téléportes les armor_stands (avec un tag Outside par exemple) vers le haut tant qu'ils ne rencontrent pas de blocs. J'appelle la fonction "detect__if_outside"
Code:
execute as @e[tag=Outside] at @s if block ~ ~ ~ air run tp @s ~ ~1 ~
Oon téléporte de un vers le haut si il y a de l'air à la position de l'AS
Code:
execute as @e[tag=Outside] at @s unless block ~ ~  ~ air run [...]
On donne un tag "IsOutside" au joueur ayant le même ID que l'AS si celui-ci n'est plus dans de l'air
Code:
execute at @e[tag=Outside] at @s unless ~ ~ ~ air run kill @s
On tue l'entité si elle n'est plus dans de l'air
Code:
execute if entity @e[tag=Outside] run function [namespace]:detect_if_outside
On lance la récursive pour continuer le TP
- Si le joueur possède le tag "IsOutside", alors on lui applique les effets !
 

Vivi5454

Aventurier
31 Mars 2020
13
1
3
34
Super merci ! Je regarde ça dès que je peux, je ferais un retour , faut aussi que j'arrive à invoquer les Armor stand . Si j'arrive pas je reviendrai j'aimerai essayer... Tu m'a déjà bien avancé.
 
  • J'aime
Reactions: Oromis

Vivi5454

Aventurier
31 Mars 2020
13
1
3
34
Alors j'ai réussi a faire spawn un Armor stand invisible sur tout les joueurs. J'ai eu du mal juste pour ça alors pour coller une id la .... Je regarde mais au pire ça serais possible d'avoir la commande avec une petite explication ?
 

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Bah c'est assez simple !
Tu crées un scoreboard avec un score "NewID" que tu initialises à 0 par exemple.
Puis à chaque fois que tu as besoin de générer un ID, tu attribues "NewID" à tes deux entités, puis tu incrémentes NewID de 1. Ce qui fait que chaque paire d'entité aura un ID différent ;)