--- title: Lumières Dynamiques type: docs weight: 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 : ```java 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 : ```java 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é : ```java 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 ```java // 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 ```java // Supprimer le composant pour désactiver la lumière componentAccessor.removeComponent( entityRef, DynamicLight.getComponentType() ); ``` ## Configurations de Lumière Courantes ### Lueur Feu/Chaleur ```java ColorLight fireLight = new ColorLight( (byte) 12, (byte) 255, // Rouge élevé (byte) 150, // Orange moyen (byte) 50 // Bleu faible ); ``` ### Lueur Glace/Froid ```java ColorLight iceLight = new ColorLight( (byte) 10, (byte) 100, // Rouge faible (byte) 200, // Vert moyen (byte) 255 // Bleu élevé ); ``` ### Lueur Magie/Violet ```java ColorLight magicLight = new ColorLight( (byte) 15, (byte) 200, // Rouge élevé (byte) 50, // Vert faible (byte) 255 // Bleu élevé ); ``` ### Lueur Soin/Vert ```java 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 ```java // Ajouter un effet de lueur temporaire à un joueur public void addGlowEffect(Player player, ComponentAccessor 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 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 : ```java // Suivre les entités pulsantes private final Map, Integer> pulsingEntities = new ConcurrentHashMap<>(); // Appeler cette méthode à chaque tick public void onTick(float deltaTime) { for (Map.Entry, Integer> entry : pulsingEntities.entrySet()) { Ref 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 entityRef) { pulsingEntities.put(entityRef, 0); } public void stopPulsingLight(Ref 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 >}}