From 5d64e33bff560d636c6efc652ffba74c229841c7 Mon Sep 17 00:00:00 2001 From: LambdAurora Date: Wed, 29 Jan 2025 19:10:24 +0100 Subject: [PATCH] Update to 25w05a. --- CHANGELOG.md | 5 +- .../api/entity/EntityLightSource.java | 29 +++- .../api/entity/EntityLightSourceManager.java | 12 +- .../luminance/ItemDerivedEntityLuminance.java | 4 +- .../main/kotlin/lambdynamiclights.gradle.kts | 2 +- .../kotlin/lambdynamiclights/Constants.kt | 2 +- gradle/libs.versions.toml | 12 +- .../lambdynlights/DynamicLightsConfig.java | 15 +- .../lambdynlights/LambDynLights.java | 10 +- .../lambdynlights/gui/SettingsScreen.java | 3 +- .../lightsource/FireflyParticleMixin.java | 162 ++++++++++++++++++ .../WetSensititiveEntityLuminance.java | 2 +- .../assets/lambdynlights/lang/en_us.json | 2 + .../assets/lambdynlights/lang/fr_ca.json | 2 + .../assets/lambdynlights/lang/fr_fr.json | 2 + .../lambdynlights.lightsource.mixins.json | 1 + src/main/resources/lambdynlights.toml | 2 + 17 files changed, 238 insertions(+), 29 deletions(-) create mode 100644 src/main/java/dev/lambdaurora/lambdynlights/mixin/lightsource/FireflyParticleMixin.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 35439f08..49ebc2d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -282,8 +282,11 @@ - Fixed Upside-down English translations ([#257](https://github.com/LambdAurora/LambDynamicLights/pull/257)). - Fixed custom dynamic light sources sometimes not updating previously lit chunks. -### 4.0.2 +### 4.1.0 +- Updated to Minecraft 1.21.5. +- Added dynamic lighting to Firefly particles. +- Added support for entity component predicates. - Updated Traditional Chinese translations ([#261](https://github.com/LambdAurora/LambDynamicLights/pull/261)). - Updated Turkish translations ([#263](https://github.com/LambdAurora/LambDynamicLights/pull/263)). diff --git a/api/src/main/java/dev/lambdaurora/lambdynlights/api/entity/EntityLightSource.java b/api/src/main/java/dev/lambdaurora/lambdynlights/api/entity/EntityLightSource.java index b10bb3e8..e61ce53b 100644 --- a/api/src/main/java/dev/lambdaurora/lambdynlights/api/entity/EntityLightSource.java +++ b/api/src/main/java/dev/lambdaurora/lambdynlights/api/entity/EntityLightSource.java @@ -15,6 +15,7 @@ import dev.lambdaurora.lambdynlights.api.item.ItemLightSourceManager; import dev.lambdaurora.lambdynlights.api.predicate.LightSourceLocationPredicate; import net.minecraft.advancements.critereon.*; +import net.minecraft.core.component.DataComponentExactPredicate; import net.minecraft.world.entity.Entity; import org.jetbrains.annotations.Range; @@ -27,7 +28,7 @@ * @param predicate the predicate to select which entities emit the given luminance * @param luminances the luminance sources * @author LambdAurora - * @version 4.0.0 + * @version 4.1.0 * @since 4.0.0 */ public record EntityLightSource(EntityPredicate predicate, List luminances) { @@ -77,20 +78,28 @@ public record EntityPredicate( Optional equipment, Optional vehicle, Optional passenger, - Optional slots + Optional slots, + Optional components ) { public static final Codec CODEC = Codec.recursive( "EntityPredicate", codec -> RecordCodecBuilder.create( instance -> instance.group( - EntityTypePredicate.CODEC.optionalFieldOf("type").forGetter(EntityPredicate::entityType), - LightSourceLocationPredicate.CODEC.optionalFieldOf("location").forGetter(EntityPredicate::located), - MobEffectsPredicate.CODEC.optionalFieldOf("effects").forGetter(EntityPredicate::effects), - EntityFlagsPredicate.CODEC.optionalFieldOf("flags").forGetter(EntityPredicate::flags), - EntityEquipmentPredicate.CODEC.optionalFieldOf("equipment").forGetter(EntityPredicate::equipment), + EntityTypePredicate.CODEC.optionalFieldOf("type") + .forGetter(EntityPredicate::entityType), + LightSourceLocationPredicate.CODEC.optionalFieldOf("location") + .forGetter(EntityPredicate::located), + MobEffectsPredicate.CODEC.optionalFieldOf("effects") + .forGetter(EntityPredicate::effects), + EntityFlagsPredicate.CODEC.optionalFieldOf("flags") + .forGetter(EntityPredicate::flags), + EntityEquipmentPredicate.CODEC.optionalFieldOf("equipment") + .forGetter(EntityPredicate::equipment), codec.optionalFieldOf("vehicle").forGetter(EntityPredicate::vehicle), codec.optionalFieldOf("passenger").forGetter(EntityPredicate::passenger), - SlotsPredicate.CODEC.optionalFieldOf("slots").forGetter(EntityPredicate::slots) + SlotsPredicate.CODEC.optionalFieldOf("slots").forGetter(EntityPredicate::slots), + DataComponentExactPredicate.CODEC.optionalFieldOf("components") + .forGetter(EntityPredicate::components) ) .apply(instance, EntityPredicate::new) ) @@ -120,8 +129,10 @@ public boolean test(Entity entity) { } else if (this.passenger.isPresent() && entity.getPassengers().stream().noneMatch(passenger -> this.passenger.get().test(passenger))) { return false; + } else if (this.slots.isPresent() && !((SlotsPredicate) this.slots.get()).matches(entity)) { + return false; } else { - return this.slots.isEmpty() || this.slots.get().matches(entity); + return this.components.isEmpty() || !this.components.get().test(entity); } } } diff --git a/api/src/main/java/dev/lambdaurora/lambdynlights/api/entity/EntityLightSourceManager.java b/api/src/main/java/dev/lambdaurora/lambdynlights/api/entity/EntityLightSourceManager.java index 127f076f..f73da8ce 100644 --- a/api/src/main/java/dev/lambdaurora/lambdynlights/api/entity/EntityLightSourceManager.java +++ b/api/src/main/java/dev/lambdaurora/lambdynlights/api/entity/EntityLightSourceManager.java @@ -28,7 +28,7 @@ * which provides the ability to register light sources for entities, and to query their luminance. * * @author LambdAurora - * @version 4.0.0 + * @version 4.1.0 * @see EntityLightSource * @since 4.0.0 */ @@ -86,7 +86,10 @@ interface RegisterContext { default void register(@NotNull EntityType entityType, @Range(from = 0, to = 15) int luminance) { this.register(new EntityLightSource( new EntityLightSource.EntityPredicate( - Optional.of(EntityTypePredicate.of(this.registryAccess().lookupOrThrow(Registries.ENTITY_TYPE), entityType)), + Optional.of(EntityTypePredicate.of( + this.registryAccess().lookupOrThrow(Registries.ENTITY_TYPE), entityType + )), + Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), @@ -110,7 +113,10 @@ default void register(@NotNull EntityType entityType, @Range(from = 0, to = 1 default void register(@NotNull EntityType entityType, EntityLuminance... luminance) { this.register(new EntityLightSource( new EntityLightSource.EntityPredicate( - Optional.of(EntityTypePredicate.of(this.registryAccess().lookupOrThrow(Registries.ENTITY_TYPE), entityType)), + Optional.of(EntityTypePredicate.of( + this.registryAccess().lookupOrThrow(Registries.ENTITY_TYPE), entityType + )), + Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), diff --git a/api/src/main/java/dev/lambdaurora/lambdynlights/api/entity/luminance/ItemDerivedEntityLuminance.java b/api/src/main/java/dev/lambdaurora/lambdynlights/api/entity/luminance/ItemDerivedEntityLuminance.java index d588edcb..1ee0aad7 100644 --- a/api/src/main/java/dev/lambdaurora/lambdynlights/api/entity/luminance/ItemDerivedEntityLuminance.java +++ b/api/src/main/java/dev/lambdaurora/lambdynlights/api/entity/luminance/ItemDerivedEntityLuminance.java @@ -31,7 +31,7 @@ * @param includeRain {@code true} if the wetness check should include rain, or {@code false} otherwise * @param always let the item be always considered dry or wet if present * @author LambdAurora - * @version 4.0.0 + * @version 4.1.0 * @since 4.0.0 */ public record ItemDerivedEntityLuminance(ItemStack item, boolean includeRain, Optional always) implements EntityLuminance { @@ -53,7 +53,7 @@ public record ItemDerivedEntityLuminance(ItemStack item, boolean includeRain, Op boolean wet = this.always.map(value -> switch (value) { case DRY -> false; case WET -> true; - }).orElseGet(() -> this.includeRain ? entity.isInWaterRainOrBubble() : entity.isSubmergedInWater()); + }).orElseGet(() -> this.includeRain ? entity.isInWaterOrRain() : entity.isSubmergedInWater()); return itemLightSourceManager.getLuminance(this.item, wet); } diff --git a/build_logic/src/main/kotlin/lambdynamiclights.gradle.kts b/build_logic/src/main/kotlin/lambdynamiclights.gradle.kts index c79b6fd8..715dbe40 100644 --- a/build_logic/src/main/kotlin/lambdynamiclights.gradle.kts +++ b/build_logic/src/main/kotlin/lambdynamiclights.gradle.kts @@ -31,7 +31,7 @@ val generateFmj = tasks.register("generateFmj", GenerateFmjTask::class) { .withIcon("assets/${Constants.NAMESPACE}/icon.png") .withEnvironment("client") .withDepend("fabricloader", ">=${libs.versions.fabric.loader.get()}") - .withDepend("minecraft", "~1.21.4-") + .withDepend("minecraft", "~1.21.5-") .withDepend("java", ">=${Constants.JAVA_VERSION}") .withModMenu { it.withLink("modmenu.curseforge", "https://www.curseforge.com/minecraft/mc-mods/lambdynamiclights") diff --git a/build_logic/src/main/kotlin/lambdynamiclights/Constants.kt b/build_logic/src/main/kotlin/lambdynamiclights/Constants.kt index 1db93335..b52006d1 100644 --- a/build_logic/src/main/kotlin/lambdynamiclights/Constants.kt +++ b/build_logic/src/main/kotlin/lambdynamiclights/Constants.kt @@ -7,7 +7,7 @@ object Constants { const val NAME = "lambdynamiclights" const val NAMESPACE = "lambdynlights" const val PRETTY_NAME = "LambDynamicLights" - const val VERSION = "4.0.2" + const val VERSION = "4.1.0-alpha.1" const val JAVA_VERSION = 21 const val DESCRIPTION = "The most feature-complete dynamic lighting mod for Fabric." diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index eeebb555..283e17b4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,17 +1,17 @@ [versions] -minecraft = "1.21.4" -fabric-loader = "0.16.9" -fabric-api = "0.110.5+1.21.4" -mappings-yalmm = "9" +minecraft = "25w05a" +fabric-loader = "0.16.10" +fabric-api = "0.115.1+1.21.5" +mappings-yalmm = "1" mappings-parchment = "2024.07.28" # Dependencies yumi-commons = "1.0.0-alpha.2" spruceui = "6.2.0+1.21.3" pridelib = "1.3.0+1.21.2" -modmenu = "12.0.0-beta.1" +modmenu = "13.0.1" trinkets = "3.10.0" -accessories = "1.2.1-beta.2+1.21.2" +accessories = "1.2.15-beta+1.21.4" # Configuration nightconfig = "3.8.1" diff --git a/src/main/java/dev/lambdaurora/lambdynlights/DynamicLightsConfig.java b/src/main/java/dev/lambdaurora/lambdynlights/DynamicLightsConfig.java index ba5803bf..5b07a066 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/DynamicLightsConfig.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/DynamicLightsConfig.java @@ -30,7 +30,7 @@ * Represents the mod configuration. * * @author LambdAurora - * @version 4.0.0 + * @version 4.1.0 * @since 1.0.0 */ public class DynamicLightsConfig { @@ -53,6 +53,7 @@ public class DynamicLightsConfig { private final BooleanSettingEntry selfLightSource; private final BooleanSettingEntry waterSensitiveCheck; private final BooleanSettingEntry beamLighting; + private final BooleanSettingEntry fireflyLighting; private final BooleanSettingEntry guardianLaser; private final BooleanSettingEntry debugActiveDynamicLightingCells; private final BooleanSettingEntry debugDisplayDynamicLightingChunkRebuild; @@ -94,6 +95,10 @@ public DynamicLightsConfig(@NotNull LambDynLights mod) { "light_sources.beam", true, this.config, Text.translatable("lambdynlights.option.light_sources.beam.tooltip") ); + this.fireflyLighting = new BooleanSettingEntry( + "light_sources.firefly", true, this.config, + Text.translatable("lambdynlights.option.light_sources.firefly.tooltip") + ); this.guardianLaser = new BooleanSettingEntry( "light_sources.guardian_laser", true, this.config, Text.translatable("lambdynlights.option.light_sources.guardian_laser.tooltip") @@ -116,6 +121,7 @@ public DynamicLightsConfig(@NotNull LambDynLights mod) { this.selfLightSource, this.waterSensitiveCheck, this.beamLighting, + this.fireflyLighting, this.guardianLaser, this.debugActiveDynamicLightingCells, this.debugDisplayDynamicLightingChunkRebuild, @@ -260,6 +266,13 @@ public BooleanSettingEntry getBeamLighting() { return this.beamLighting; } + /** + * {@return the firefly light source setting holder} + */ + public BooleanSettingEntry getFireflyLighting() { + return this.fireflyLighting; + } + /** * {@return the guardian laser light source setting holder} */ diff --git a/src/main/java/dev/lambdaurora/lambdynlights/LambDynLights.java b/src/main/java/dev/lambdaurora/lambdynlights/LambDynLights.java index 80b1dd23..da81ae02 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/LambDynLights.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/LambDynLights.java @@ -49,6 +49,7 @@ import net.minecraft.resources.io.ResourceType; import net.minecraft.util.profiling.Profiler; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.BlockAndTintGetter; @@ -68,7 +69,7 @@ * Represents the LambDynamicLights mod. * * @author LambdAurora - * @version 4.0.1 + * @version 4.1.0 * @since 1.0.0 */ @ApiStatus.Internal @@ -509,9 +510,12 @@ public static int getLivingEntityLuminanceFromItems(LivingEntity entity) { boolean submergedInFluid = isEyeSubmergedInFluid(entity); int luminance = 0; - for (var equipped : entity.getAllSlots()) { - if (!equipped.isEmpty()) + for (var equipmentSlot : EquipmentSlot.VALUES) { + var equipped = entity.getItemBySlot(equipmentSlot); + + if (!equipped.isEmpty()) { luminance = Math.max(luminance, INSTANCE.itemLightSources.getLuminance(equipped, submergedInFluid)); + } } if (luminance < 15) { diff --git a/src/main/java/dev/lambdaurora/lambdynlights/gui/SettingsScreen.java b/src/main/java/dev/lambdaurora/lambdynlights/gui/SettingsScreen.java index 559ecd52..a7ca960b 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/gui/SettingsScreen.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/gui/SettingsScreen.java @@ -190,7 +190,8 @@ private void buildGeneralTab(TabContext context) { list.addSingleOptionEntry(this.waterSensitiveOption); list.addSingleOptionEntry(new SpruceSeparatorOption(SPECIAL_DYNAMIC_LIGHT_SOURCES_KEY, true, null)); list.addOptionEntry(this.creeperLightingOption, this.tntLightingOption); - list.addOptionEntry(this.config.getBeamLighting().getOption(), this.config.getGuardianLaser().getOption()); + list.addOptionEntry(this.config.getBeamLighting().getOption(), this.config.getFireflyLighting().getOption()); + list.addSmallSingleOptionEntry(this.config.getGuardianLaser().getOption()); context.addInnerWidget(list); } diff --git a/src/main/java/dev/lambdaurora/lambdynlights/mixin/lightsource/FireflyParticleMixin.java b/src/main/java/dev/lambdaurora/lambdynlights/mixin/lightsource/FireflyParticleMixin.java new file mode 100644 index 00000000..236d681a --- /dev/null +++ b/src/main/java/dev/lambdaurora/lambdynlights/mixin/lightsource/FireflyParticleMixin.java @@ -0,0 +1,162 @@ +/* + * Copyright © 2025 LambdAurora + * + * This file is part of LambDynamicLights. + * + * Licensed under the Lambda License. For more information, + * see the LICENSE file. + */ + +package dev.lambdaurora.lambdynlights.mixin.lightsource; + +import dev.lambdaurora.lambdynlights.LambDynLights; +import dev.lambdaurora.lambdynlights.engine.source.EntityDynamicLightSourceBehavior; +import it.unimi.dsi.fastutil.longs.LongSet; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.FireflyParticle; +import net.minecraft.client.particle.TextureSheetParticle; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(FireflyParticle.class) +public abstract class FireflyParticleMixin extends TextureSheetParticle implements EntityDynamicLightSourceBehavior { + @Shadow + public abstract int getLightColor(float f); + + protected FireflyParticleMixin(ClientLevel level, double x, double y, double z) { + super(level, x, y, z); + } + + @Unique + protected int lambdynlights$luminance = 0; + @Unique + private int lambdynlights$lastLuminance = 0; + @Unique + private long lambdynlights$lastUpdate = 0; + @Unique + private double lambdynlights$prevX; + @Unique + private double lambdynlights$prevY; + @Unique + private double lambdynlights$prevZ; + @Unique + private LongSet lambdynlights$trackedLitChunkPos = LongSet.of(); + + @Override + public double getDynamicLightX() { + return this.x; + } + + @Override + public double getDynamicLightY() { + return this.y; + } + + @Override + public double getDynamicLightZ() { + return this.z; + } + + @Override + public Level dynamicLightWorld() { + return this.level; + } + + @Override + public double getDynamicLightPrevX() { + return this.lambdynlights$prevX; + } + + @Override + public double getDynamicLightPrevY() { + return this.lambdynlights$prevY; + } + + @Override + public double getDynamicLightPrevZ() { + return this.lambdynlights$prevZ; + } + + @Override + public void updateDynamicLightPreviousCoordinates() { + this.lambdynlights$prevX = this.getDynamicLightX(); + this.lambdynlights$prevY = this.getDynamicLightY(); + this.lambdynlights$prevZ = this.getDynamicLightZ(); + } + + @Override + public void resetDynamicLight() { + this.lambdynlights$lastLuminance = 0; + } + + @Override + public boolean shouldUpdateDynamicLight() { + var mode = LambDynLights.get().config.getDynamicLightsMode(); + if (!mode.isEnabled()) + return false; + if (mode.hasDelay()) { + long currentTime = System.currentTimeMillis(); + if (currentTime < this.lambdynlights$lastUpdate + mode.getDelay()) { + return false; + } + + this.lambdynlights$lastUpdate = currentTime; + } + return true; + } + + @Override + public int getLuminance() { + return this.lambdynlights$luminance; + } + + @Override + public void setLuminance(int luminance) { + this.lambdynlights$luminance = luminance; + } + + @Override + public int getLastDynamicLuminance() { + return this.lambdynlights$lastLuminance; + } + + @Override + public void setLastDynamicLuminance(int luminance) { + this.lambdynlights$lastLuminance = luminance; + } + + @Override + public LongSet lambdynlights$getTrackedLitChunkPos() { + return this.lambdynlights$trackedLitChunkPos; + } + + @Override + public void lambdynlights$setTrackedLitChunkPos(LongSet trackedLitChunkPos) { + this.lambdynlights$trackedLitChunkPos = trackedLitChunkPos; + } + + @Inject(method = "tick", at = @At("RETURN")) + private void lambdynlights$onTick(CallbackInfo ci) { + if (this.removed) { + this.setDynamicLightEnabled(false); + } else { + if (LambDynLights.get().config.getFireflyLighting().get()) { + this.dynamicLightTick(); + } else { + this.setLuminance(0); + } + LambDynLights.updateTracking(this); + } + } + + @Override + public void dynamicLightTick() { + this.setLuminance(LightTexture.block(this.getLightColor(0)) / 2); + } +} diff --git a/src/main/java/dev/lambdaurora/lambdynlights/resource/entity/luminance/WetSensititiveEntityLuminance.java b/src/main/java/dev/lambdaurora/lambdynlights/resource/entity/luminance/WetSensititiveEntityLuminance.java index 620c5e42..f2120541 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/resource/entity/luminance/WetSensititiveEntityLuminance.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/resource/entity/luminance/WetSensititiveEntityLuminance.java @@ -52,7 +52,7 @@ public record WetSensititiveEntityLuminance( @Override public @Range(from = 0, to = 15) int getLuminance(@NotNull ItemLightSourceManager itemLightSourceManager, @NotNull Entity entity) { - boolean submergedInWater = entity.isInWaterRainOrBubble(); + boolean submergedInWater = entity.isInWaterOrRain(); boolean shouldCareAboutWater = LambDynLights.get().config.getWaterSensitiveCheck().get(); if (submergedInWater && (shouldCareAboutWater || this.dry.isEmpty())) { diff --git a/src/main/resources/assets/lambdynlights/lang/en_us.json b/src/main/resources/assets/lambdynlights/lang/en_us.json index 7deee8a2..dff640dc 100644 --- a/src/main/resources/assets/lambdynlights/lang/en_us.json +++ b/src/main/resources/assets/lambdynlights/lang/en_us.json @@ -21,6 +21,8 @@ "lambdynlights.option.light_sources.beam.tooltip": "Enables the dynamic lighting of Beacon or End Gateway beams. They should rarely update.", "lambdynlights.option.light_sources.block_entities": "Block Entities", "lambdynlights.option.light_sources.entities": "Entities", + "lambdynlights.option.light_sources.firefly": "Firefly", + "lambdynlights.option.light_sources.firefly.tooltip": "Enables the dynamic lighting of firefly particles emitted by Firefly Bushes.", "lambdynlights.option.light_sources.guardian_laser": "Guardian Lasers", "lambdynlights.option.light_sources.guardian_laser.tooltip": "Enables the dynamic lighting of the lasers shot by Guardians.", "lambdynlights.option.light_sources.self": "First-Person", diff --git a/src/main/resources/assets/lambdynlights/lang/fr_ca.json b/src/main/resources/assets/lambdynlights/lang/fr_ca.json index 3b1e1396..6fd77cc1 100644 --- a/src/main/resources/assets/lambdynlights/lang/fr_ca.json +++ b/src/main/resources/assets/lambdynlights/lang/fr_ca.json @@ -21,6 +21,8 @@ "lambdynlights.option.light_sources.beam.tooltip": "Active la lumière dynamique des faisceaux des balises et des passerelles de l'End. Celles-ci devraient se mettre à jour rarement.", "lambdynlights.option.light_sources.block_entities": "Entités de blocs", "lambdynlights.option.light_sources.entities": "Entités", + "lambdynlights.option.light_sources.firefly": "Lucioles", + "lambdynlights.option.light_sources.firefly.tooltip": "Active la lumière dynamique venant des particules de lucioles aux alentours des bouissons à lucioles.", "lambdynlights.option.light_sources.guardian_laser": "Laser de gardiens", "lambdynlights.option.light_sources.guardian_laser.tooltip": "Active la lumière dynamique venant des lasers projetés par des gardiens.", "lambdynlights.option.light_sources.self": "Première personne", diff --git a/src/main/resources/assets/lambdynlights/lang/fr_fr.json b/src/main/resources/assets/lambdynlights/lang/fr_fr.json index 3b1e1396..6fd77cc1 100644 --- a/src/main/resources/assets/lambdynlights/lang/fr_fr.json +++ b/src/main/resources/assets/lambdynlights/lang/fr_fr.json @@ -21,6 +21,8 @@ "lambdynlights.option.light_sources.beam.tooltip": "Active la lumière dynamique des faisceaux des balises et des passerelles de l'End. Celles-ci devraient se mettre à jour rarement.", "lambdynlights.option.light_sources.block_entities": "Entités de blocs", "lambdynlights.option.light_sources.entities": "Entités", + "lambdynlights.option.light_sources.firefly": "Lucioles", + "lambdynlights.option.light_sources.firefly.tooltip": "Active la lumière dynamique venant des particules de lucioles aux alentours des bouissons à lucioles.", "lambdynlights.option.light_sources.guardian_laser": "Laser de gardiens", "lambdynlights.option.light_sources.guardian_laser.tooltip": "Active la lumière dynamique venant des lasers projetés par des gardiens.", "lambdynlights.option.light_sources.self": "Première personne", diff --git a/src/main/resources/lambdynlights.lightsource.mixins.json b/src/main/resources/lambdynlights.lightsource.mixins.json index 984ae69e..03528ba6 100644 --- a/src/main/resources/lambdynlights.lightsource.mixins.json +++ b/src/main/resources/lambdynlights.lightsource.mixins.json @@ -7,6 +7,7 @@ "BeaconBlockEntityMixin", "EntityMixin", "FallingBlockEntityMixin", + "FireflyParticleMixin", "GuardianEntityMixin", "LivingEntityMixin", "PlayerEntityMixin", diff --git a/src/main/resources/lambdynlights.toml b/src/main/resources/lambdynlights.toml index d5ac1400..182f9e58 100644 --- a/src/main/resources/lambdynlights.toml +++ b/src/main/resources/lambdynlights.toml @@ -16,6 +16,8 @@ mode = "fancy" tnt = "off" # Enables dynamic lighting of beacon or end gateway beams. beam = true + # Enables dynamic lighting of firefly particles from Firefly Bushes. + firefly = true # Enables dynamic lighting of Guardian's lasers. This also can be toggled off by disabling Guardian dynamic lighting. guardian_laser = true