From 87c3ce4c0eebe73dfde07e045a963b77695b1741 Mon Sep 17 00:00:00 2001 From: LambdAurora Date: Thu, 9 Jul 2020 21:41:00 +0200 Subject: [PATCH] LambDynamicLights v1.2.1: Add some tweaks, TNT lighting and fixes. --- API.md | 74 +++++++++++++++ CHANGELOG.md | 7 ++ gradle.properties | 4 +- .../lambdynlights/DynamicLightsConfig.java | 78 +++++++++++++--- .../lambdynlights/DynamicLightsMode.java | 27 +++--- .../lambdynlights/ExplosiveLightingMode.java | 90 +++++++++++++++++++ .../lambdynlights/LambDynLights.java | 23 ++++- .../api/DynamicLightHandler.java | 36 +++++++- .../api/DynamicLightHandlers.java | 9 +- .../lambdynlights/gui/SettingsScreen.java | 21 ++++- .../mixin/lightsource/PlayerEntityMixin.java | 8 +- .../mixin/lightsource/TntEntityMixin.java | 83 +++++++++++++++++ .../assets/lambdynlights/lang/en_us.json | 5 +- .../assets/lambdynlights/lang/fr_ca.json | 7 +- .../assets/lambdynlights/lang/fr_fr.json | 7 +- .../tags/items/water_sensitive.json | 1 + .../lambdynlights.lightsource.mixins.json | 3 +- src/main/resources/lambdynlights.toml | 4 + 18 files changed, 438 insertions(+), 49 deletions(-) create mode 100644 API.md create mode 100644 src/main/java/me/lambdaurora/lambdynlights/ExplosiveLightingMode.java create mode 100644 src/main/java/me/lambdaurora/lambdynlights/mixin/lightsource/TntEntityMixin.java diff --git a/API.md b/API.md new file mode 100644 index 00000000..0e14064d --- /dev/null +++ b/API.md @@ -0,0 +1,74 @@ +# LambDynamicLights API + +You added a new entity that could emit light? You want that it dynamically emits light? + +Then try the API of this mod! + +## Quick note + +Every time entity is referenced it means either an entity or a block entity. + +Block entity dynamic lighting is non-recommended if avoidable with block states. + +If your entity re-implements tick without calling the super method the dynamic light handler will not work. + +## Dynamic light handlers + +### `DynamicLightHandler` + +A dynamic light handler is an interface with one method: `int getLuminance(T lightSource)`. + +The returned value is between 0 and 15 which are luminance values, `lightSource` is of the type of the entity and is the targeted entity. +The method is called for every entity matching the type at each tick. + +### `DynamicLightHandlers` + +That's where you register your handler! + +Just call `DynamicLightHandlers#registerDynamicLightHandler(EntityType, DynamicLightHandler)` +or `DynamicLightHandlers#registerDynamicLightHandler(BlockEntityType, DynamicLightHandler)` +to register your handler! + +If a handler is already registered for this entity, then it will merge the two handlers with a `Math#max` handler. + +And that's all! The mod will light up your entities following your handler. + +### Examples + +#### Blaze + +```java +registerDynamicLightHandler(EntityType.BLAZE, entity -> 10); +``` + +#### Enderman + +```java +registerDynamicLightHandler(EntityType.ENDERMAN, entity -> { + int luminance = 0; + if (entity.getCarriedBlock() != null) + luminance = entity.getCarriedBlock().getLuminance(); + return luminance; +}); +``` + +#### Item frame + +```java +registerDynamicLightHandler(EntityType.ITEM_FRAME, entity -> { + World world = entity.getEntityWorld(); + return LambDynLights.getLuminanceFromItemStack(entity.getHeldItemStack(), !world.getFluidState(entity.getBlockPos()).isEmpty()); +}); +``` + +## Utility methods + + - `DynamicLightHandler#makeLivingEntityHandler` will merge the given handler with a basic handler for living entity which detects item light sources. + - `DynamicLightHandler#makeCreeperEntityHandler` will optionally merge the given handler with a basic handler for creepers. May be useful for Creepers mod. + - `LambDynLights#getLuminanceFromItemStack` will return the luminance value of the given item stack. + +## `#lambdynlights:water_sensitive` tag + +This is an item tag which lists water-sensitive light-emitting items. + +Every items listed in this tag will not emit light in water. diff --git a/CHANGELOG.md b/CHANGELOG.md index adb0fc6e..e2c69c6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,3 +29,10 @@ - Added "early/WIP" compatibility with [Canvas Renderer](https://www.curseforge.com/minecraft/mc-mods/canvas-renderer). - Added a warning message about performance issues. - Fixed a crash with Sodium rc7 with smooth lighting set to HIGH. + +### v1.2.1 + + - Added TNT dynamic lighting. + - Added lighting options for TNT and Creepers. + - Updated SpruceUI to v1.5.8 + - Fixed player dynamic lighting not getting tracked when changing dimensions. diff --git a/gradle.properties b/gradle.properties index 9206750f..da0c2c8e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,12 +8,12 @@ yarn_mappings=1.16.1+build.19:v2 loader_version=0.8.9+build.203 # Mod Properties -mod_version = 1.2.0 +mod_version = 1.2.1 maven_group = me.lambdaurora archives_base_name = lambdynamiclights # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api fabric_version=0.14.0+build.371-1.16 -spruceui_version=1.5.6 +spruceui_version=1.5.8 modmenu_version=1.12.2+build.17 diff --git a/src/main/java/me/lambdaurora/lambdynlights/DynamicLightsConfig.java b/src/main/java/me/lambdaurora/lambdynlights/DynamicLightsConfig.java index 0e0f94f2..c344b12a 100644 --- a/src/main/java/me/lambdaurora/lambdynlights/DynamicLightsConfig.java +++ b/src/main/java/me/lambdaurora/lambdynlights/DynamicLightsConfig.java @@ -24,21 +24,25 @@ * Represents the mod configuration. * * @author LambdAurora - * @version 1.2.0 + * @version 1.2.1 * @since 1.0.0 */ public class DynamicLightsConfig { - private static final DynamicLightsMode DEFAULT_DYNAMIC_LIGHTS_MODE = DynamicLightsMode.OFF; - private static final boolean DEFAULT_ENTITIES_LIGHT_SOURCE = true; - private static final boolean DEFAULT_BLOCK_ENTITIES_LIGHT_SOURCE = true; - private static final boolean DEFAULT_WATER_SENSITIVE_CHECK = true; + private static final DynamicLightsMode DEFAULT_DYNAMIC_LIGHTS_MODE = DynamicLightsMode.OFF; + private static final boolean DEFAULT_ENTITIES_LIGHT_SOURCE = true; + private static final boolean DEFAULT_BLOCK_ENTITIES_LIGHT_SOURCE = true; + private static final boolean DEFAULT_WATER_SENSITIVE_CHECK = true; + private static final ExplosiveLightingMode DEFAULT_CREEPER_LIGHTING_MODE = ExplosiveLightingMode.SIMPLE; + private static final ExplosiveLightingMode DEFAULT_TNT_LIGHTING_MODE = ExplosiveLightingMode.OFF; - public static final Path CONFIG_FILE_PATH = Paths.get("config/lambdynlights.toml"); - protected final FileConfig config; - private final LambDynLights mod; - private boolean firstTime; - private DynamicLightsMode dynamicLightsMode; + public static final Path CONFIG_FILE_PATH = Paths.get("config/lambdynlights.toml"); + protected final FileConfig config; + private final LambDynLights mod; + private boolean firstTime; + private DynamicLightsMode dynamicLightsMode; + private ExplosiveLightingMode creeperLightingMode; + private ExplosiveLightingMode tntLightingMode; public final Option dynamicLightsModeOption = new SpruceCyclingOption("lambdynlights.option.mode", amount -> this.setDynamicLightsMode(this.dynamicLightsMode.next()), @@ -68,6 +72,10 @@ public void load() String dynamicLightsModeValue = this.config.getOrElse("mode", DEFAULT_DYNAMIC_LIGHTS_MODE.getName()); this.dynamicLightsMode = DynamicLightsMode.byId(dynamicLightsModeValue) .orElse(DEFAULT_DYNAMIC_LIGHTS_MODE); + this.creeperLightingMode = ExplosiveLightingMode.byId(this.config.getOrElse("light_sources.creeper", DEFAULT_CREEPER_LIGHTING_MODE.getName())) + .orElse(DEFAULT_CREEPER_LIGHTING_MODE); + this.tntLightingMode = ExplosiveLightingMode.byId(this.config.getOrElse("light_sources.tnt", DEFAULT_TNT_LIGHTING_MODE.getName())) + .orElse(DEFAULT_TNT_LIGHTING_MODE); if (dynamicLightsModeValue.equalsIgnoreCase("none")) { this.firstTime = true; @@ -93,6 +101,8 @@ public void reset() this.setEntitiesLightSource(DEFAULT_ENTITIES_LIGHT_SOURCE); this.setBlockEntitiesLightSource(DEFAULT_BLOCK_ENTITIES_LIGHT_SOURCE); this.setWaterSensitiveCheck(DEFAULT_WATER_SENSITIVE_CHECK); + this.setCreeperLightingMode(DEFAULT_CREEPER_LIGHTING_MODE); + this.setTntLightingMode(DEFAULT_TNT_LIGHTING_MODE); } /** @@ -195,4 +205,52 @@ public void setWaterSensitiveCheck(boolean waterSensitive) { this.config.set("light_sources.water_sensitive_check", waterSensitive); } + + /** + * Returns the Creeper dynamic lighting mode. + * + * @return The Creeper dynamic lighting mode. + */ + public ExplosiveLightingMode getCreeperLightingMode() + { + return this.creeperLightingMode; + } + + /** + * Sets the Creeper dynamic lighting mode. + * + * @param lightingMode The Creeper dynamic lighting mode. + */ + public void setCreeperLightingMode(@NotNull ExplosiveLightingMode lightingMode) + { + this.creeperLightingMode = lightingMode; + + if (!lightingMode.isEnabled()) + this.mod.removeCreeperLightSources(); + this.config.set("light_sources.creeper", lightingMode.getName()); + } + + /** + * Returns the TNT dynamic lighting mode. + * + * @return The TNT dynamic lighting mode. + */ + public ExplosiveLightingMode getTntLightingMode() + { + return this.tntLightingMode; + } + + /** + * Sets the TNT dynamic lighting mode. + * + * @param lightingMode The TNT dynamic lighting mode. + */ + public void setTntLightingMode(@NotNull ExplosiveLightingMode lightingMode) + { + this.tntLightingMode = lightingMode; + + if (!lightingMode.isEnabled()) + this.mod.removeTntLightSources(); + this.config.set("light_sources.tnt", lightingMode.getName()); + } } diff --git a/src/main/java/me/lambdaurora/lambdynlights/DynamicLightsMode.java b/src/main/java/me/lambdaurora/lambdynlights/DynamicLightsMode.java index c5026572..c7526e06 100644 --- a/src/main/java/me/lambdaurora/lambdynlights/DynamicLightsMode.java +++ b/src/main/java/me/lambdaurora/lambdynlights/DynamicLightsMode.java @@ -9,8 +9,8 @@ package me.lambdaurora.lambdynlights; +import me.lambdaurora.spruceui.SpruceTexts; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; import org.aperlambda.lambdacommon.utils.Nameable; import org.jetbrains.annotations.NotNull; @@ -22,23 +22,23 @@ * Represents the dynamic lights mode. * * @author LambdAurora - * @version 1.0.0 + * @version 1.2.1 * @since 1.0.0 */ public enum DynamicLightsMode implements Nameable { - OFF(0, Formatting.RED), - FASTEST(500, Formatting.GOLD), - FAST(250, Formatting.YELLOW), - FANCY(0, Formatting.GREEN); + OFF(0, Formatting.RED, SpruceTexts.OPTIONS_OFF), + FASTEST(500, Formatting.GOLD, SpruceTexts.OPTIONS_GENERIC_FASTEST), + FAST(250, Formatting.YELLOW, SpruceTexts.OPTIONS_GENERIC_FAST), + FANCY(0, Formatting.GREEN, SpruceTexts.OPTIONS_GENERIC_FANCY); - private final int delay; - private final Formatting formatting; + private final int delay; + private final Text translatedText; - DynamicLightsMode(int delay, @NotNull Formatting formatting) + DynamicLightsMode(int delay, @NotNull Formatting formatting, @NotNull Text translatedText) { this.delay = delay; - this.formatting = formatting; + this.translatedText = translatedText.copy().formatted(formatting); } /** @@ -84,11 +84,6 @@ public DynamicLightsMode next() return v[this.ordinal() + 1]; } - public @NotNull String getTranslationKey() - { - return this == OFF ? "options.off" : ("lambdynlights.mode." + this.getName()); - } - /** * Returns the translated text of the dynamic lights mode. * @@ -96,7 +91,7 @@ public DynamicLightsMode next() */ public @NotNull Text getTranslatedText() { - return new TranslatableText(this.getTranslationKey()).formatted(this.formatting); + return this.translatedText; } @Override diff --git a/src/main/java/me/lambdaurora/lambdynlights/ExplosiveLightingMode.java b/src/main/java/me/lambdaurora/lambdynlights/ExplosiveLightingMode.java new file mode 100644 index 00000000..d69ef025 --- /dev/null +++ b/src/main/java/me/lambdaurora/lambdynlights/ExplosiveLightingMode.java @@ -0,0 +1,90 @@ +/* + * Copyright © 2020 LambdAurora + * + * This file is part of LambDynamicLights. + * + * Licensed under the MIT license. For more information, + * see the LICENSE file. + */ + +package me.lambdaurora.lambdynlights; + +import me.lambdaurora.spruceui.SpruceTexts; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.aperlambda.lambdacommon.utils.Nameable; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.Optional; + +/** + * Represents the explosives dynamic lighting mode. + * + * @author LambdAurora + * @version 1.2.1 + * @since 1.2.1 + */ +public enum ExplosiveLightingMode implements Nameable +{ + OFF(Formatting.RED, SpruceTexts.OPTIONS_OFF), + SIMPLE(Formatting.YELLOW, SpruceTexts.OPTIONS_GENERIC_SIMPLE), + FANCY(Formatting.GREEN, SpruceTexts.OPTIONS_GENERIC_FANCY); + + private final Text translatedText; + + ExplosiveLightingMode(@NotNull Formatting formatting, @NotNull Text translatedText) + { + this.translatedText = translatedText.copy().formatted(formatting); + } + + /** + * Returns whether this mode enables explosives dynamic lighting. + * + * @return True if the mode enables explosives dynamic lighting, else false. + */ + public boolean isEnabled() + { + return this != OFF; + } + + /** + * Returns the next explosives dynamic lighting mode available. + * + * @return The next available explosives dynamic lighting mode. + */ + public ExplosiveLightingMode next() + { + ExplosiveLightingMode[] v = values(); + if (v.length == this.ordinal() + 1) + return v[0]; + return v[this.ordinal() + 1]; + } + + /** + * Returns the translated text of the explosives dynamic lighting mode. + * + * @return The translated text of the explosives dynamic lighting mode. + */ + public @NotNull Text getTranslatedText() + { + return this.translatedText; + } + + @Override + public @NotNull String getName() + { + return this.name().toLowerCase(); + } + + /** + * Gets the explosives dynamic lighting mode from its identifier. + * + * @param id The identifier of the explosives dynamic lighting mode. + * @return The explosives dynamic lighting mode if found, else empty. + */ + public static @NotNull Optional byId(@NotNull String id) + { + return Arrays.stream(values()).filter(mode -> mode.getName().equalsIgnoreCase(id)).findFirst(); + } +} diff --git a/src/main/java/me/lambdaurora/lambdynlights/LambDynLights.java b/src/main/java/me/lambdaurora/lambdynlights/LambDynLights.java index 118957c3..6895e67e 100644 --- a/src/main/java/me/lambdaurora/lambdynlights/LambDynLights.java +++ b/src/main/java/me/lambdaurora/lambdynlights/LambDynLights.java @@ -21,6 +21,8 @@ import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.toast.SystemToast; import net.minecraft.entity.Entity; +import net.minecraft.entity.TntEntity; +import net.minecraft.entity.mob.CreeperEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; @@ -47,7 +49,7 @@ * Represents the LambDynamicLights mod. * * @author LambdAurora - * @version 1.2.0 + * @version 1.2.1 * @since 1.0.0 */ public class LambDynLights implements ClientModInitializer @@ -307,6 +309,22 @@ public void removeEntitiesLightSource() this.removeLightSources(lightSource -> (lightSource instanceof Entity && !(lightSource instanceof PlayerEntity))); } + /** + * Removes Creeper light sources from tracked light sources. + */ + public void removeCreeperLightSources() + { + this.removeLightSources(entity -> entity instanceof CreeperEntity); + } + + /** + * Removes TNT light sources from tracked light sources. + */ + public void removeTntLightSources() + { + this.removeLightSources(entity -> entity instanceof TntEntity); + } + /** * Removes block entities light source from tracked light sources. */ @@ -383,7 +401,8 @@ public static int getLuminanceFromItemStack(@NotNull ItemStack stack, boolean su } else if (stack.getItem() == Items.LAVA_BUCKET) { return Blocks.LAVA.getDefaultState().getLuminance(); } else if (stack.getItem() == Items.BLAZE_ROD - || stack.getItem() == Items.BLAZE_POWDER) { + || stack.getItem() == Items.BLAZE_POWDER + || stack.getItem() == Items.FIRE_CHARGE) { return 10; } else if (stack.getItem() == Items.GLOWSTONE_DUST || stack.getItem() == Items.PRISMARINE_CRYSTALS) { diff --git a/src/main/java/me/lambdaurora/lambdynlights/api/DynamicLightHandler.java b/src/main/java/me/lambdaurora/lambdynlights/api/DynamicLightHandler.java index 446ab2fb..bd8cf71c 100644 --- a/src/main/java/me/lambdaurora/lambdynlights/api/DynamicLightHandler.java +++ b/src/main/java/me/lambdaurora/lambdynlights/api/DynamicLightHandler.java @@ -11,15 +11,17 @@ import me.lambdaurora.lambdynlights.LambDynLights; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.mob.CreeperEntity; import net.minecraft.item.ItemStack; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * Represents a dynamic light handler. * * @param The type of the light source. * @author LambdAurora - * @version 1.2.0 + * @version 1.2.1 * @since 1.1.0 */ public interface DynamicLightHandler @@ -49,4 +51,36 @@ public interface DynamicLightHandler return Math.max(luminance, handler.getLuminance(entity)); }; } + + /** + * Returns a Creeper dynamic light handler. + * + * @param handler Extra handler. + * @param The type of Creeper entity. + * @return The completed handler. + */ + static @NotNull DynamicLightHandler makeCreeperEntityHandler(@Nullable DynamicLightHandler handler) + { + return entity -> { + int luminance = 0; + + if (entity.getClientFuseTime(0.0F) > 0.001D) { + switch (LambDynLights.get().config.getCreeperLightingMode()) { + case OFF: + return 0; + case SIMPLE: + luminance = 10; + break; + case FANCY: + luminance = (int) (entity.getClientFuseTime(0.0F) * 10.0); + break; + } + } + + if (handler != null) + luminance = Math.max(luminance, handler.getLuminance(entity)); + + return luminance; + }; + } } diff --git a/src/main/java/me/lambdaurora/lambdynlights/api/DynamicLightHandlers.java b/src/main/java/me/lambdaurora/lambdynlights/api/DynamicLightHandlers.java index f1a2d7de..6e438b56 100644 --- a/src/main/java/me/lambdaurora/lambdynlights/api/DynamicLightHandlers.java +++ b/src/main/java/me/lambdaurora/lambdynlights/api/DynamicLightHandlers.java @@ -23,10 +23,10 @@ /** * @author LambdAurora - * @version 1.2.0 + * @version 1.2.1 * @since 1.1.0 */ -public class DynamicLightHandlers +public final class DynamicLightHandlers { private static Map, DynamicLightHandler> ENTITES_HANDLER = new HashMap<>(); private static Map, DynamicLightHandler> BLOCK_ENTITIES_HANDLER = new HashMap<>(); @@ -37,10 +37,7 @@ public class DynamicLightHandlers public static void registerDefaultHandlers() { registerDynamicLightHandler(EntityType.BLAZE, entity -> 10); - registerDynamicLightHandler(EntityType.CREEPER, entity -> { - if (entity.getClientFuseTime(0.0F) > 0.001D) return 10; - else return 0; - }); + registerDynamicLightHandler(EntityType.CREEPER, DynamicLightHandler.makeCreeperEntityHandler(null)); registerDynamicLightHandler(EntityType.ENDERMAN, entity -> { int luminance = 0; if (entity.getCarriedBlock() != null) diff --git a/src/main/java/me/lambdaurora/lambdynlights/gui/SettingsScreen.java b/src/main/java/me/lambdaurora/lambdynlights/gui/SettingsScreen.java index c0e27a3a..741452b5 100644 --- a/src/main/java/me/lambdaurora/lambdynlights/gui/SettingsScreen.java +++ b/src/main/java/me/lambdaurora/lambdynlights/gui/SettingsScreen.java @@ -10,10 +10,12 @@ package me.lambdaurora.lambdynlights.gui; import me.lambdaurora.lambdynlights.DynamicLightsConfig; +import me.lambdaurora.lambdynlights.ExplosiveLightingMode; import me.lambdaurora.lambdynlights.LambDynLights; import me.lambdaurora.lambdynlights.LambDynLightsCompat; import me.lambdaurora.spruceui.Tooltip; import me.lambdaurora.spruceui.option.SpruceBooleanOption; +import me.lambdaurora.spruceui.option.SpruceCyclingOption; import me.lambdaurora.spruceui.option.SpruceResetOption; import me.lambdaurora.spruceui.option.SpruceSeparatorOption; import net.minecraft.client.MinecraftClient; @@ -30,7 +32,7 @@ * Represents the settings screen of LambDynamicLights. * * @author LambdAurora - * @version 1.2.0 + * @version 1.2.1 * @since 1.0.0 */ public class SettingsScreen extends Screen @@ -40,6 +42,8 @@ public class SettingsScreen extends Screen private final Option entitiesOption; private final Option blockEntitiesOption; private final Option waterSensitiveOption; + private final Option creeperLightingOption; + private final Option tntLightingOption; private final Option resetOption; private ButtonListWidget list; @@ -61,6 +65,20 @@ public SettingsScreen(@Nullable Screen parent) this.config::hasWaterSensitiveCheck, this.config::setWaterSensitiveCheck, new TranslatableText("lambdynlights.tooltip.water_sensitive")); + this.creeperLightingOption = new SpruceCyclingOption("entity.minecraft.creeper", + amount -> this.config.setCreeperLightingMode(this.config.getCreeperLightingMode().next()), + option -> option.getDisplayText(this.config.getCreeperLightingMode().getTranslatedText()), + new TranslatableText("lambdynlights.tooltip.creeper_lighting", + ExplosiveLightingMode.OFF.getTranslatedText(), + ExplosiveLightingMode.SIMPLE.getTranslatedText(), + ExplosiveLightingMode.FANCY.getTranslatedText())); + this.tntLightingOption = new SpruceCyclingOption("block.minecraft.tnt", + amount -> this.config.setTntLightingMode(this.config.getTntLightingMode().next()), + option -> option.getDisplayText(this.config.getTntLightingMode().getTranslatedText()), + new TranslatableText("lambdynlights.tooltip.tnt_lighting", + ExplosiveLightingMode.OFF.getTranslatedText(), + ExplosiveLightingMode.SIMPLE.getTranslatedText(), + ExplosiveLightingMode.FANCY.getTranslatedText())); this.resetOption = new SpruceResetOption(btn -> { this.config.reset(); MinecraftClient client = MinecraftClient.getInstance(); @@ -91,6 +109,7 @@ protected void init() this.list.addSingleOptionEntry(new SpruceSeparatorOption("lambdynlights.menu.light_sources", true, null)); this.list.addOptionEntry(this.entitiesOption, this.blockEntitiesOption); this.list.addOptionEntry(this.waterSensitiveOption, null); + this.list.addOptionEntry(this.creeperLightingOption, this.tntLightingOption); this.children.add(list); this.addButton(this.resetOption.createButton(this.client.options, this.width / 2 - 155, this.height - 29, 150)); diff --git a/src/main/java/me/lambdaurora/lambdynlights/mixin/lightsource/PlayerEntityMixin.java b/src/main/java/me/lambdaurora/lambdynlights/mixin/lightsource/PlayerEntityMixin.java index 1e83b29c..a146bf6d 100644 --- a/src/main/java/me/lambdaurora/lambdynlights/mixin/lightsource/PlayerEntityMixin.java +++ b/src/main/java/me/lambdaurora/lambdynlights/mixin/lightsource/PlayerEntityMixin.java @@ -25,7 +25,8 @@ public abstract class PlayerEntityMixin extends LivingEntity implements DynamicL @Shadow public abstract boolean isSpectator(); - private int lambdynlights_luminance; + private int lambdynlights_luminance; + private World lambdynlights_lastWorld; protected PlayerEntityMixin(EntityType entityType, World world) { @@ -48,6 +49,11 @@ public void dynamicLightTick() if (this.isSpectator()) this.lambdynlights_luminance = 0; + + if (this.lambdynlights_lastWorld != this.getEntityWorld()) { + this.lambdynlights_lastWorld = this.getEntityWorld(); + this.lambdynlights_luminance = 0; + } } @Override diff --git a/src/main/java/me/lambdaurora/lambdynlights/mixin/lightsource/TntEntityMixin.java b/src/main/java/me/lambdaurora/lambdynlights/mixin/lightsource/TntEntityMixin.java new file mode 100644 index 00000000..d2ee7b7d --- /dev/null +++ b/src/main/java/me/lambdaurora/lambdynlights/mixin/lightsource/TntEntityMixin.java @@ -0,0 +1,83 @@ +/* + * Copyright © 2020 LambdAurora + * + * This file is part of LambDynamicLights. + * + * Licensed under the MIT license. For more information, + * see the LICENSE file. + */ + +package me.lambdaurora.lambdynlights.mixin.lightsource; + +import me.lambdaurora.lambdynlights.DynamicLightSource; +import me.lambdaurora.lambdynlights.ExplosiveLightingMode; +import me.lambdaurora.lambdynlights.LambDynLights; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.TntEntity; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(TntEntity.class) +public abstract class TntEntityMixin extends Entity implements DynamicLightSource +{ + @Shadow + private int fuseTimer; + + private double lambdynlights_startFuseTimer = 80.0; + private int lambdynlights_luminance; + + public TntEntityMixin(EntityType type, World world) + { + super(type, world); + } + + @Inject(method = "(Lnet/minecraft/entity/EntityType;Lnet/minecraft/world/World;)V", at = @At("TAIL")) + private void onNew(EntityType entityType, World world, CallbackInfo ci) + { + this.lambdynlights_startFuseTimer = this.fuseTimer; + } + + @Inject(method = "tick", at = @At("TAIL")) + private void onTick(CallbackInfo ci) + { + if (this.getEntityWorld().isClient()) { + if (!LambDynLights.get().config.getTntLightingMode().isEnabled()) + return; + + // We do not want to update the entity on the server. + if (this.removed) { + this.setDynamicLightEnabled(false); + } else { + this.dynamicLightTick(); + LambDynLights.updateTracking(this); + } + } + } + + @Override + public void dynamicLightTick() + { + if (this.isOnFire()) { + this.lambdynlights_luminance = 15; + } else { + ExplosiveLightingMode lightingMode = LambDynLights.get().config.getTntLightingMode(); + if (lightingMode == ExplosiveLightingMode.FANCY) { + double fuse = this.fuseTimer / this.lambdynlights_startFuseTimer; + this.lambdynlights_luminance = (int) (-(fuse * fuse) * 10.0) + 10; + } else { + this.lambdynlights_luminance = 10; + } + } + } + + @Override + public int getLuminance() + { + return this.lambdynlights_luminance; + } +} diff --git a/src/main/resources/assets/lambdynlights/lang/en_us.json b/src/main/resources/assets/lambdynlights/lang/en_us.json index e3375f90..c332e93b 100644 --- a/src/main/resources/assets/lambdynlights/lang/en_us.json +++ b/src/main/resources/assets/lambdynlights/lang/en_us.json @@ -3,18 +3,17 @@ "lambdynlights.menu.title": "LambDynamicLights Settings", "lambdynlights.menu.canvas.1": "Disabling entities dynamic lighting is recommended with Canvas!", "lambdynlights.menu.canvas.2": "Dynamic lighting with Canvas is currently performance heavy!", - "lambdynlights.mode.fastest": "Fastest", - "lambdynlights.mode.fast": "Fast", - "lambdynlights.mode.fancy": "Fancy", "lambdynlights.option.block_entities": "Block Entities", "lambdynlights.option.entities": "Entities", "lambdynlights.option.mode": "Dynamic Lights", "lambdynlights.option.water_sensitive": "Water Sensitivity Check", "lambdynlights.toast.first_time": "Disabled by default, check out mod or Video Settings!", "lambdynlights.tooltip.block_entities": "Enables block entities dynamic lighting.", + "lambdynlights.tooltip.creeper_lighting": "Sets the Creeper dynamic lighting mode.\n- %s disables Creeper dynamic lighting.\n- %s sets a constant luminance.\n- %s sets a dynamic luminance.", "lambdynlights.tooltip.entities": "Enables entities dynamic lighting. Note: players are always active.", "lambdynlights.tooltip.mode.1": "Enables dynamic lights. If enabled a player holding a torch will light up the area for example.", "lambdynlights.tooltip.mode.2": "%s and %s will lag a bit behind but minimizes light updates.", "lambdynlights.tooltip.mode.3": "%s is smooth dynamic lighting.", + "lambdynlights.tooltip.tnt_lighting": "Sets the TNT dynamic lighting mode.\n- %s disables TNT dynamic lighting.\n- %s sets a constant luminance.\n- %s sets a dynamic luminance.", "lambdynlights.tooltip.water_sensitive": "Enables the water-sensitive light sources check. This means that some items will not emit light while being submerged in water." } \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/lang/fr_ca.json b/src/main/resources/assets/lambdynlights/lang/fr_ca.json index 6147286b..572bbf2c 100644 --- a/src/main/resources/assets/lambdynlights/lang/fr_ca.json +++ b/src/main/resources/assets/lambdynlights/lang/fr_ca.json @@ -1,18 +1,19 @@ { "lambdynlights.menu.light_sources": "Sources de lumières dynamiques", "lambdynlights.menu.title": "LambDynamicLights paramètres", - "lambdynlights.mode.fastest": "Très rapides", - "lambdynlights.mode.fast": "Rapides", - "lambdynlights.mode.fancy": "Détaillés", + "lambdynlights.menu.canvas.1": "Désactiver la lumière dynamique provenante des entités est recommendé avec Canvas!", + "lambdynlights.menu.canvas.2": "La lumière dynamique avec Canvas est actuellement très demandante en ressources!", "lambdynlights.option.block_entities": "Entités blocs", "lambdynlights.option.entities": "Entités", "lambdynlights.option.mode": "Lumières dynamiques", "lambdynlights.option.water_sensitive": "Sensibilité à l'eau", "lambdynlights.toast.first_time": "Désactivé par défaut, veuillez vérifier les paramètres vidéo ou les paramètres du mod!", "lambdynlights.tooltip.block_entities": "Active les lumières dynamiques provenantes des entités blocs.", + "lambdynlights.tooltip.creeper_lighting": "Détermine le mode de lumière dynamique de la Creeper.\n- %s: désactive la lumière dynamique pour la Creeper.\n- %s: ajoute un niveau de lumière constant.\n- %s: ajoute un niveau de lumière dynamique.", "lambdynlights.tooltip.entities": "Active les lumières dynamiques provenantes des entités. Note: les joueurs sont toujours actifs.", "lambdynlights.tooltip.mode.1": "Active les lumières dynamiques. Par exemple, si activé alors un joueur tenant une torche va éclairer l'espace autour.", "lambdynlights.tooltip.mode.2": "%s et %s ont un mouvement saccadé mais mettent à jour la lumière le moins possible.", "lambdynlights.tooltip.mode.3": "%s a un mouvement fluide.", + "lambdynlights.tooltip.tnt_lighting": "Détermine le mode de lumière dynamique de la TNT.\n- %: désactive la lumière dynamique pour la TNT.\n- %s: ajoute un niveau de lumière constant.\n- %s: ajoute un niveau de lumière dynamique.", "lambdynlights.tooltip.water_sensitive": "Active la vérification de sources de lumière sensibles à l'eau. C'est-à-dire que certains objets ne vont pas émettre de lumière dans l'eau comme la torche." } \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/lang/fr_fr.json b/src/main/resources/assets/lambdynlights/lang/fr_fr.json index 6147286b..74bf509a 100644 --- a/src/main/resources/assets/lambdynlights/lang/fr_fr.json +++ b/src/main/resources/assets/lambdynlights/lang/fr_fr.json @@ -1,18 +1,19 @@ { "lambdynlights.menu.light_sources": "Sources de lumières dynamiques", "lambdynlights.menu.title": "LambDynamicLights paramètres", - "lambdynlights.mode.fastest": "Très rapides", - "lambdynlights.mode.fast": "Rapides", - "lambdynlights.mode.fancy": "Détaillés", + "lambdynlights.menu.canvas.1": "Désactiver la lumière dynamique provenante des entités est recommendé avec Canvas!", + "lambdynlights.menu.canvas.2": "La lumière dynamique avec Canvas est actuellement très demandante en ressources!", "lambdynlights.option.block_entities": "Entités blocs", "lambdynlights.option.entities": "Entités", "lambdynlights.option.mode": "Lumières dynamiques", "lambdynlights.option.water_sensitive": "Sensibilité à l'eau", "lambdynlights.toast.first_time": "Désactivé par défaut, veuillez vérifier les paramètres vidéo ou les paramètres du mod!", "lambdynlights.tooltip.block_entities": "Active les lumières dynamiques provenantes des entités blocs.", + "lambdynlights.tooltip.creeper_lighting": "Détermine le mode de lumière dynamique de la Creeper.\n- %s: désactive la lumière dynamique pour la Creeper.\n- %s: ajoute un niveau de lumière constant.\n- %s: ajoute un niveau de lumière dynamique.", "lambdynlights.tooltip.entities": "Active les lumières dynamiques provenantes des entités. Note: les joueurs sont toujours actifs.", "lambdynlights.tooltip.mode.1": "Active les lumières dynamiques. Par exemple, si activé alors un joueur tenant une torche va éclairer l'espace autour.", "lambdynlights.tooltip.mode.2": "%s et %s ont un mouvement saccadé mais mettent à jour la lumière le moins possible.", "lambdynlights.tooltip.mode.3": "%s a un mouvement fluide.", + "lambdynlights.tooltip.tnt_lighting": "Détermine le mode de lumière dynamique de la TNT.\n- %s: désactive la lumière dynamique pour la TNT.\n- %s: ajoute un niveau de lumière constant.\n- %s: ajoute un niveau de lumière dynamique.", "lambdynlights.tooltip.water_sensitive": "Active la vérification de sources de lumière sensibles à l'eau. C'est-à-dire que certains objets ne vont pas émettre de lumière dans l'eau comme la torche." } \ No newline at end of file diff --git a/src/main/resources/data/lambdynlights/tags/items/water_sensitive.json b/src/main/resources/data/lambdynlights/tags/items/water_sensitive.json index 8632de00..aaccc4ef 100644 --- a/src/main/resources/data/lambdynlights/tags/items/water_sensitive.json +++ b/src/main/resources/data/lambdynlights/tags/items/water_sensitive.json @@ -2,6 +2,7 @@ "replace": false, "values": [ "minecraft:campfire", + "minecraft:fire_charge", "minecraft:lantern", "minecraft:lava_bucket", "minecraft:redstone_torch", diff --git a/src/main/resources/lambdynlights.lightsource.mixins.json b/src/main/resources/lambdynlights.lightsource.mixins.json index 90186a3a..dc753596 100644 --- a/src/main/resources/lambdynlights.lightsource.mixins.json +++ b/src/main/resources/lambdynlights.lightsource.mixins.json @@ -8,7 +8,8 @@ "EntityMixin", "ExplosiveProjectileEntityMixin", "LivingEntityMixin", - "PlayerEntityMixin" + "PlayerEntityMixin", + "TntEntityMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/lambdynlights.toml b/src/main/resources/lambdynlights.toml index 17133b4d..61afa129 100644 --- a/src/main/resources/lambdynlights.toml +++ b/src/main/resources/lambdynlights.toml @@ -10,3 +10,7 @@ mode = "none" block_entities = true # Enables water-sensitive light sources check. This means that water-sensitive items will not light up when submerged in water. water_sensitive_check = true + # Creeper lighting mode. May be off, simple or fancy. + creeper = "simple" + # TNT lighting mode. May be off, simple or fancy. + tnt = "off"