Résolu Détecter la lumière sur un joueur (1.14+)

Alpha Gaming24

Aventurier
7 Décembre 2019
5
0
1
19
Bonjour,

J'ai un projet pour un DataPack 1.14+.
Mon but détecter la lumière qu'un joueur reçois que la lumière naturelle (soleil) les torches ne doivent pas infecté, comme un zombie.

Le changement de lumière devra faire changer un score et de effet seront donnés selon le score.

Je vous remercie pour l'aide et d'avoir pris le temps de lire ce message.
Alpha Gaming24
 

Eglaios

Crétin de la commu
14 Avril 2018
310
42
89
24
Yo!

Détecter si la lumière du jour frappe un joueur, c'est simplement impossible; ce n'est pas une entité et il n'y a pas de tag nbt "Exposé à la lumière du jour"...

Par contre, on peut simplement détecter s'il y a des blocs au-dessus de la tête du joueur, et ce, pendant une certaine période de la journée.

* * *​

Je t'ai préparé un mini-pack compatible en multijoueur avec 4 fonctions toutes simples, dont voici le fonctionnement :

Lorsqu'il fait jour (déterminé entre 0 et 11615 ticks de la journée), si un joueur dans le monde normal (Dimension:0) n'a que des blocs d'air entre lui et la couche 255, il reçoit le tag "Daylight". Il le perd dès qu'un bloc autre que l'air est détecté au-dessus de lui (voir vidéo).
Ben flûte, j'ai oublié de montrer mais si on met la nuit, on ne peut plus être exposé à la lumière du jour (logique)


Et maintenant, le contenu du pack (que tu peux télécharger plus bas) :
Code:
###Executed at reload


#Message d'activation
tellraw @a {"text":"Détecteur d'exposition à la lumière du jour : activé","color":"light_purple"}

#Ajout des objectifs

#Objectif servant à stocker la hauteur des joueurs et détecter la hauteur maximale de détection
  scoreboard objectives add HeightTest dummy

#Objectif servant à stocker l'avancée de la journée
  scoreboard objectives add GameTime dummy
Code:
###Exécuté chaque tick
#Note : le pack ne cible que les joueurs dans l'overworld (Dimension:0), la nuit étant absente dans les autres dimensions


#Stocke l'avancée de la journée du jeu dans le score GameTime du joueur fictif "$GameTime"
execute store result score $GameTime GameTime run time query daytime

#Enlève le tag Sunlight pour répéter le test
tag @a[tag=Sunlight] remove Sunlight

#Exécute le test d'exposition à la lumière du jour (défini de 0 à 11615 ticks), ajoute le tag "Sunlight" s'il n'y a aucun bloc entre le joueur et la couche 255 (hauteur max de blocs)
execute as @a[nbt={Dimension:0}] if score $GameTime GameTime matches 0..11615 at @s positioned ~ ~1 ~ run function daylight_test:daylight_test_init

#Message de statut
title @a[nbt={Dimension:0},tag=!Sunlight] actionbar {"text":"Tu es protégé de la lumière du jour","color":"green"}
title @a[nbt={Dimension:0},tag=Sunlight] actionbar {"text":"Tu es exposé à la lumière du jour","color":"red"}
Code:
###Exécuté depuis main / Ajoute le tag Sunlight s'il n'y a que de l'air entre la tête du joueur et la couche 255


#Stocke la hauteur du joueur dans son score HeightTest
execute store result score @s HeightTest run data get entity @s Pos[1]

#Exécute le test de blocs depuis la tête du joueur jusqu'à la couche 255
function daylight_test:daylight_test

#Si le test a été interrompu avant la couche 255, le tag Sunlight est ajouté
execute if score @s HeightTest matches 256.. run tag @s add Sunlight
Code:
###Exécuté depuis daylight_test_init / Cherche des blocs autres que l'air depuis la tête du joueur jusqu'à la couche 255


#Augmente la hauteur de détection de 1
scoreboard players add @s HeightTest 1

#Si la hauteur de détection est de moins de 256 et si la détection n'a trouvé que de l'air, répétition de la fonction
execute unless score @s HeightTest matches 256.. if block ~ ~ ~ minecraft:air positioned ~ ~1 ~ run function daylight_test:daylight_test

Voilà voilà...

Si tu as le temps, tu peux rédiger un fichier de tags de blocks regroupant tous ceux qui laissent passer la lumière (air compris); avec ce que je te propose, même le verre ou une ficelle peuvent protéger du soleil (remplacer "air" dans la fonction daylight_test par ton tag)


Dernière chose : détecter autant de blocs par ticks ne sollicite que très peu le jeu; la détection ne nécessite aucune entité est est uniquement effectuée en positions relatives
De toutes façons, moi, avec mon pc d'avant-guerre, ma priorité après la compatibilité multijoueur, c'est la fluidité du jeu...
 

Fichiers joints

  • Sunlight detector.zip
    4.2 KB · Affichages: 273
Dernière édition:

Eglaios

Crétin de la commu
14 Avril 2018
310
42
89
24
je pose ca là, au cas où ! :mobpig:
Le mec est loin devant, donc pas évident de refaire ca sans connaissance datapack !

C'est quoi sa technique de détection?

Ah ben je connaissais pas les "predicates" dans son pack... c'est cool, c'est nouveau de la 1.15?

Ah ben oui... l'ennui, c'est que j'ai peur de me mettre à la 1.15 vu le contenu toujours plus lourd...
 
Dernière édition:

Alpha Gaming24

Aventurier
7 Décembre 2019
5
0
1
19
Bonjour,
Je vous remercie pour cette réponse.
Je dois avouer que détecter un bloc est une très bonne alternative.
Pour la vidéo sur la 1.15, elle met aussi d'une grande utilité je ressortirai une nouvelle version avec cette méthode.

Merci de m'avoir accordé de votre temps.
Alpha Gaming24