Files
Documentation/content/advanced/effects/dynamic-lights.fr.md
2026-01-20 20:33:59 +01:00

7.1 KiB

title, type, weight
title type weight
Lumières Dynamiques docs 2

Les lumières dynamiques ajoutent des effets de lueur aux entités en utilisant le composant DynamicLight.

Structure ColorLight

La classe ColorLight définit les propriétés de la lumière :

import com.hypixel.hytale.protocol.ColorLight;

public class ColorLight {
    public byte radius;     // 0-255 (rayon/intensité de la lumière)
    public byte red;        // 0-255 (canal rouge)
    public byte green;      // 0-255 (canal vert)
    public byte blue;       // 0-255 (canal bleu)

    public ColorLight(byte radius, byte red, byte green, byte blue) {
        this.radius = radius;
        this.red = red;
        this.green = green;
        this.blue = blue;
    }
}

Composant DynamicLight

Ajoutez des effets de lueur temporaires aux entités :

import com.hypixel.hytale.server.core.modules.entity.component.DynamicLight;
import com.hypixel.hytale.protocol.ColorLight;

// Créer une lumière colorée (rayon, R, V, B)
ColorLight light = new ColorLight(
    (byte) 15,      // Rayon (0-255)
    (byte) 255,     // Rouge (0-255)
    (byte) 100,     // Vert (0-255)
    (byte) 50       // Bleu (0-255)
);

// Ajouter le composant DynamicLight
DynamicLight dynamicLight = new DynamicLight(light);
componentAccessor.putComponent(
    entityRef,
    DynamicLight.getComponentType(),
    dynamicLight
);

Composant PersistentDynamicLight

Utilisez ce composant quand la lumière doit être sauvegardée avec les données de l'entité :

import com.hypixel.hytale.server.core.modules.entity.component.PersistentDynamicLight;

// Créer une lumière persistante
PersistentDynamicLight persistentLight = new PersistentDynamicLight(light);
componentAccessor.putComponent(
    entityRef,
    PersistentDynamicLight.getComponentType(),
    persistentLight
);

Mettre à Jour les Propriétés de Lumière

// Obtenir le composant de lumière existant
DynamicLight dynamicLight = store.getComponent(
    entityRef,
    DynamicLight.getComponentType()
);

if (dynamicLight != null) {
    // Créer de nouvelles propriétés de lumière
    ColorLight newLight = new ColorLight(
        (byte) 20,      // Nouveau rayon
        (byte) 0,       // Pas de rouge
        (byte) 255,     // Vert maximum
        (byte) 100      // Un peu de bleu
    );

    // Mettre à jour et marquer pour sync réseau
    dynamicLight.setColorLight(newLight);
    // isNetworkOutdated est défini automatiquement
}

Supprimer la Lumière

// Supprimer le composant pour désactiver la lumière
componentAccessor.removeComponent(
    entityRef,
    DynamicLight.getComponentType()
);

Configurations de Lumière Courantes

Lueur Feu/Chaleur

ColorLight fireLight = new ColorLight(
    (byte) 12,
    (byte) 255,    // Rouge élevé
    (byte) 150,    // Orange moyen
    (byte) 50      // Bleu faible
);

Lueur Glace/Froid

ColorLight iceLight = new ColorLight(
    (byte) 10,
    (byte) 100,    // Rouge faible
    (byte) 200,    // Vert moyen
    (byte) 255     // Bleu élevé
);

Lueur Magie/Violet

ColorLight magicLight = new ColorLight(
    (byte) 15,
    (byte) 200,    // Rouge élevé
    (byte) 50,     // Vert faible
    (byte) 255     // Bleu élevé
);

Lueur Soin/Vert

ColorLight healLight = new ColorLight(
    (byte) 10,
    (byte) 50,     // Rouge faible
    (byte) 255,    // Vert élevé
    (byte) 100     // Bleu moyen
);

Exemples Pratiques

Ajouter un Effet de Lueur à un Joueur

// Ajouter un effet de lueur temporaire à un joueur
public void addGlowEffect(Player player, ComponentAccessor<EntityStore> componentAccessor,
                          ScheduledExecutorService scheduler) {
    World world = player.getWorld();

    // Ajouter une lueur temporaire
    ColorLight glow = new ColorLight(
        (byte) 8,
        (byte) 255,
        (byte) 215,
        (byte) 0    // Couleur dorée
    );

    DynamicLight light = new DynamicLight(glow);
    Ref<EntityStore> entityRef = player.getReference();
    componentAccessor.putComponent(
        entityRef,
        DynamicLight.getComponentType(),
        light
    );

    // Supprimer après 3 secondes avec le scheduling Java standard
    scheduler.schedule(() -> {
        world.execute(() -> {
            if (entityRef.isValid()) {
                componentAccessor.removeComponent(
                    entityRef,
                    DynamicLight.getComponentType()
                );
            }
        });
    }, 3, TimeUnit.SECONDS);
}

{{< callout type="warning" >}} Note : Utilisez player.getReference() pour obtenir la référence d'entité, pas player.getEntityRef(). Utilisez le ScheduledExecutorService Java standard pour les tâches différées. {{< /callout >}}

Effet de Lumière Pulsante

Implémentez les effets pulsants en mettant à jour la lumière dans un gestionnaire de tick :

// Suivre les entités pulsantes
private final Map<Ref<EntityStore>, Integer> pulsingEntities = new ConcurrentHashMap<>();

// Appeler cette méthode à chaque tick
public void onTick(float deltaTime) {
    for (Map.Entry<Ref<EntityStore>, Integer> entry : pulsingEntities.entrySet()) {
        Ref<EntityStore> entityRef = entry.getKey();
        int tick = entry.getValue() + 1;
        entry.setValue(tick);

        // Calculer l'intensité pulsante
        double pulse = Math.sin(tick * 0.1) * 0.5 + 0.5;
        byte radius = (byte) (5 + pulse * 10);

        ColorLight light = new ColorLight(
            radius,
            (byte) 255,
            (byte) (int)(100 + pulse * 100),
            (byte) 50
        );

        DynamicLight dynamicLight = store.getComponent(
            entityRef,
            DynamicLight.getComponentType()
        );

        if (dynamicLight != null) {
            dynamicLight.setColorLight(light);
        }
    }
}

public void startPulsingLight(Ref<EntityStore> entityRef) {
    pulsingEntities.put(entityRef, 0);
}

public void stopPulsingLight(Ref<EntityStore> entityRef) {
    pulsingEntities.remove(entityRef);
}

Synchronisation Réseau

{{< callout type="info" >}} Détails de Sync :

  • Les changements de DynamicLight sont automatiquement marqués pour sync lors de l'utilisation de setColorLight()
  • Le flag isNetworkOutdated déclenche les mises à jour client
  • Utilisez consumeNetworkOutdated() avant les opérations de sync manuelles {{< /callout >}}

DynamicLight vs PersistentDynamicLight

Fonctionnalité DynamicLight PersistentDynamicLight
Sauvegardé sur disque Non Oui
Survit au redémarrage Non Oui
Cas d'usage Effets temporaires Lueurs permanentes
Performance Plus léger Légèrement plus lourd

Bonnes Pratiques

{{< callout type="warning" >}} Directives pour les Lumières :

  • Gardez des valeurs de rayon raisonnables (5-20 pour la plupart des effets)
  • N'ajoutez pas de lumières à trop d'entités simultanément
  • Supprimez les lumières temporaires quand plus nécessaires
  • Utilisez PersistentDynamicLight seulement quand la persistance est requise {{< /callout >}}