From e39c01ef896ef85874099346e96ba3d2b913bb34 Mon Sep 17 00:00:00 2001 From: LambdAurora Date: Sun, 4 Aug 2024 01:18:33 +0200 Subject: [PATCH] WIP new data-driven item light source system. --- CHANGELOG.md | 4 + .../api/item/ItemLightSource.java | 58 ++++++ .../api/item/ItemLightSourceManager.java | 20 ++ .../lambdynlights/api/item/ItemLuminance.java | 163 ++++++++++++++++ .../lambdynlights/LambDynLights.java | 2 +- .../api/item/ItemLightSource.java | 175 ------------------ .../item/ItemLightSources.java | 86 +++++---- .../item/adorn_black_table_lamp.json | 5 - .../item/adorn_blue_table_lamp.json | 5 - .../item/adorn_brown_table_lamp.json | 5 - .../item/adorn_cyan_table_lamp.json | 5 - .../item/adorn_gray_table_lamp.json | 5 - .../item/adorn_green_table_lamp.json | 5 - .../item/adorn_light_blue_table_lamp.json | 5 - .../item/adorn_light_gray_table_lamp.json | 5 - .../item/adorn_lime_table_lamp.json | 5 - .../item/adorn_magenta_table_lamp.json | 5 - .../item/adorn_orange_table_lamp.json | 5 - .../item/adorn_pink_table_lamp.json | 5 - .../item/adorn_purple_table_lamp.json | 5 - .../item/adorn_red_table_lamp.json | 5 - .../dynamiclights/item/adorn_stone_torch.json | 8 +- .../dynamiclights/item/adorn_table_lamps.json | 26 +++ .../item/adorn_white_table_lamp.json | 5 - .../item/adorn_yellow_table_lamp.json | 5 - .../dynamiclights/item/blaze.json | 9 + .../dynamiclights/item/blaze_powder.json | 4 - .../dynamiclights/item/blaze_rod.json | 4 - .../dynamiclights/item/campfire.json | 13 +- .../dynamiclights/item/fire_aspect.json | 14 ++ .../dynamiclights/item/fire_charge.json | 8 +- .../dynamiclights/item/glow_berries.json | 6 +- .../dynamiclights/item/glow_ink_sac.json | 6 +- .../dynamiclights/item/glowstone_dust.json | 6 +- .../dynamiclights/item/lava_bucket.json | 11 +- .../dynamiclights/item/nether_star.json | 6 +- .../item/prismarine_crystals.json | 6 +- .../dynamiclights/item/redstone_torch.json | 5 - .../dynamiclights/item/soul_campfire.json | 5 - .../dynamiclights/item/soul_torch.json | 5 - .../dynamiclights/item/spectral_arrow.json | 6 +- .../dynamiclights/item/torch.json | 14 +- 42 files changed, 405 insertions(+), 345 deletions(-) create mode 100644 api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSource.java create mode 100644 api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSourceManager.java create mode 100644 api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLuminance.java delete mode 100644 src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSource.java rename src/main/java/dev/lambdaurora/lambdynlights/{api => resource}/item/ItemLightSources.java (52%) delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_black_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_blue_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_brown_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_cyan_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_gray_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_green_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_light_blue_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_light_gray_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_lime_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_magenta_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_orange_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_pink_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_purple_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_red_table_lamp.json create mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_table_lamps.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_white_table_lamp.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_yellow_table_lamp.json create mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/blaze.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/blaze_powder.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/blaze_rod.json create mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/fire_aspect.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/redstone_torch.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/soul_campfire.json delete mode 100644 src/main/resources/assets/lambdynlights/dynamiclights/item/soul_torch.json diff --git a/CHANGELOG.md b/CHANGELOG.md index d38e6dbc..6a698d48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -177,6 +177,10 @@ ## 3.0.0 +- Changed how item light sources are defined in resource packs: + - Now item light sources support a wide-range of selection predicates thanks to data-driven improvements in the base game. + - This means enchanted items can now selectively light up, this should mostly address ([#89](https://github.com/LambdAurora/LambDynamicLights/issues/89)). + - Please refer yourself to the documentation for more details. - Updated to Minecraft 1.21 ([#227](https://github.com/LambdAurora/LambDynamicLights/pull/227)). - Updated configuration library. - Configuration corruption should now be fixed. diff --git a/api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSource.java b/api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSource.java new file mode 100644 index 00000000..8133f083 --- /dev/null +++ b/api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSource.java @@ -0,0 +1,58 @@ +/* + * Copyright © 2024 LambdAurora + * + * This file is part of LambDynamicLights. + * + * Licensed under the Lambda License. For more information, + * see the LICENSE file. + */ + +package dev.lambdaurora.lambdynlights.api.item; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.advancements.critereon.ItemPredicate; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Range; + +/** + * Represents an item light source. + * + * @param predicate the predicate to select which items emits the given luminance + * @param luminance the luminance to emit + * @param waterSensitive {@code true} if this light source is sensitive to water, or {@code false} otherwise + * @author LambdAurora + * @version 3.0.0 + * @since 3.0.0 + */ +public record ItemLightSource(ItemPredicate predicate, ItemLuminance luminance, boolean waterSensitive) { + public static final Codec CODEC = RecordCodecBuilder.create( + instance -> instance.group( + ItemPredicate.CODEC.fieldOf("match").forGetter(ItemLightSource::predicate), + ItemLuminance.CODEC.fieldOf("luminance").forGetter(ItemLightSource::luminance), + Codec.BOOL.optionalFieldOf("water_sensitive", false).forGetter(ItemLightSource::waterSensitive) + ).apply(instance, ItemLightSource::new) + ); + + public ItemLightSource(ItemPredicate predicate, int luminance) { + this(predicate, new ItemLuminance.Value(luminance)); + } + + public ItemLightSource(ItemPredicate predicate, ItemLuminance luminance) { + this(predicate, luminance, false); + } + + /** + * Gets the luminance of the item. + * + * @param stack the item stack + * @return the luminance value between {@code 0} and {@code 15} + */ + public @Range(from = 0, to = 15) int getLuminance(ItemStack stack) { + if (this.predicate.test(stack)) { + return this.luminance.getLuminance(stack); + } + + return 0; + } +} diff --git a/api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSourceManager.java b/api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSourceManager.java new file mode 100644 index 00000000..4b17e197 --- /dev/null +++ b/api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSourceManager.java @@ -0,0 +1,20 @@ +/* + * Copyright © 2024 LambdAurora + * + * This file is part of LambDynamicLights. + * + * Licensed under the Lambda License. For more information, + * see the LICENSE file. + */ + +package dev.lambdaurora.lambdynlights.api.item; + +import net.minecraft.world.item.ItemStack; + +public interface ItemLightSourceManager { + + + int getLuminance(ItemStack stack); + + int getLuminance(ItemStack stack, boolean submergedInWater); +} diff --git a/api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLuminance.java b/api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLuminance.java new file mode 100644 index 00000000..49406ce7 --- /dev/null +++ b/api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLuminance.java @@ -0,0 +1,163 @@ +/* + * Copyright © 2024 LambdAurora + * + * This file is part of LambDynamicLights. + * + * Licensed under the Lambda License. For more information, + * see the LICENSE file. + */ + +package dev.lambdaurora.lambdynlights.api.item; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.Util; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.util.Brightness; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import org.jetbrains.annotations.Range; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Stream; + +/** + * Represents the luminance value of an item. + * + * @author LambdAurora + * @version 3.0.0 + * @since 3.0.0 + */ +public sealed interface ItemLuminance permits ItemLuminance.Value, ItemLuminance.BlockReference, ItemLuminance.BlockSelf { + Codec CODEC = Codec.withAlternative( + Type.CODEC.dispatch(ItemLuminance::type, Type::codec), + Value.DIRECT_CODEC + ); + + /** + * {@return the type of this item luminance} + */ + Type type(); + + /** + * Gets the luminance of the given item stack. + * + * @param stack the item stack to get the luminance of + * @return the luminance of the given item stack + */ + @Range(from = 0, to = 15) + int getLuminance(ItemStack stack); + + /** + * Represents a direct item luminance value. + * + * @param luminance the luminance + */ + record Value(@Range(from = 0, to = 15) int luminance) implements ItemLuminance { + public static final Codec DIRECT_CODEC = Brightness.LIGHT_VALUE_CODEC.xmap(Value::new, Value::luminance); + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance.group( + Brightness.LIGHT_VALUE_CODEC.fieldOf("value").forGetter(Value::luminance) + ).apply(instance, Value::new) + ); + + @Override + public Type type() { + return Type.VALUE; + } + + @Override + public @Range(from = 0, to = 15) int getLuminance(ItemStack stack) { + return this.luminance; + } + } + + /** + * Represents an item luminance value that's derived from the referenced block's default state. + * + * @param block the referenced block + */ + record BlockReference(Block block) implements ItemLuminance { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance.group( + BuiltInRegistries.BLOCK.holderByNameCodec().fieldOf("block").forGetter(BlockReference::blockHolder) + ).apply(instance, BlockReference::new) + ); + + public BlockReference(Holder block) { + this(block.value()); + } + + @SuppressWarnings("deprecation") + public Holder blockHolder() { + return this.block.builtInRegistryHolder(); + } + + @Override + public Type type() { + return Type.BLOCK_REFERENCE; + } + + @Override + public @Range(from = 0, to = 15) int getLuminance(ItemStack stack) { + return this.block.defaultState().getLightEmission(); + } + } + + /** + * Represents the item luminance value that's derived from the block the item represents. + */ + final class BlockSelf implements ItemLuminance { + public static final BlockSelf INSTANCE = new BlockSelf(); + public static final MapCodec CODEC = MapCodec.unit(INSTANCE); + + private BlockSelf() {} + + @Override + public Type type() { + return Type.BLOCK_SELF; + } + + @Override + public @Range(from = 0, to = 15) int getLuminance(ItemStack stack) { + return Block.byItem(stack.getItem()).defaultState().getLightEmission(); + } + } + + /** + * Represents the type of item luminance value. + */ + enum Type { + VALUE("value", Value.CODEC), + BLOCK_REFERENCE("block", BlockReference.CODEC), + BLOCK_SELF("block_self", BlockSelf.CODEC); + + private static final Map BY_NAME = Util.make( + () -> Stream.of(values()).collect(HashMap::new, (map, type) -> map.put(type.getName(), type), HashMap::putAll) + ); + public static final Codec CODEC = Codec.stringResolver(Type::getName, Type::byName); + + private final String name; + private final MapCodec codec; + + Type(String name, MapCodec codec) { + this.name = name; + this.codec = codec; + } + + public String getName() { + return this.name; + } + + public MapCodec codec() { + return this.codec; + } + + public static Type byName(String name) { + return BY_NAME.get(name); + } + } +} diff --git a/src/main/java/dev/lambdaurora/lambdynlights/LambDynLights.java b/src/main/java/dev/lambdaurora/lambdynlights/LambDynLights.java index daf2007e..60d086fe 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/LambDynLights.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/LambDynLights.java @@ -12,7 +12,7 @@ import dev.lambdaurora.lambdynlights.accessor.WorldRendererAccessor; import dev.lambdaurora.lambdynlights.api.DynamicLightHandlers; import dev.lambdaurora.lambdynlights.api.DynamicLightsInitializer; -import dev.lambdaurora.lambdynlights.api.item.ItemLightSources; +import dev.lambdaurora.lambdynlights.resource.item.ItemLightSources; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; diff --git a/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSource.java b/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSource.java deleted file mode 100644 index b7dda2f1..00000000 --- a/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSource.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright © 2020 LambdAurora - * - * This file is part of LambDynamicLights. - * - * Licensed under the Lambda License. For more information, - * see the LICENSE file. - */ - -package dev.lambdaurora.lambdynlights.api.item; - -import com.google.gson.JsonObject; -import dev.lambdaurora.lambdynlights.LambDynLights; -import net.minecraft.core.component.DataComponents; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.Identifier; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.component.BlockItemStateProperties; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -/** - * Represents an item light source. - * - * @author LambdAurora - * @version 3.0.0 - * @since 1.3.0 - */ -public abstract class ItemLightSource { - private final Identifier id; - private final Item item; - private final boolean waterSensitive; - - public ItemLightSource(Identifier id, Item item, boolean waterSensitive) { - this.id = id; - this.item = item; - this.waterSensitive = waterSensitive; - } - - public ItemLightSource(Identifier id, Item item) { - this(id, item, false); - } - - public Identifier id() { - return this.id; - } - - public Item item() { - return this.item; - } - - public boolean waterSensitive() { - return this.waterSensitive; - } - - /** - * Gets the luminance of the item. - * - * @param stack the item stack - * @param submergedInWater {@code true} if submerged in water, else {@code false}. - * @return the luminance value between {@code 0} and {@code 15} - */ - public int getLuminance(ItemStack stack, boolean submergedInWater) { - if (this.waterSensitive() && LambDynLights.get().config.getWaterSensitiveCheck().get() && submergedInWater) - return 0; // Don't emit light with water sensitive items while submerged in water. - - return this.getLuminance(stack); - } - - /** - * Gets the luminance of the item. - * - * @param stack the item stack - * @return the luminance value between {@code 0} and {@code 15} - */ - public abstract int getLuminance(ItemStack stack); - - @Override - public String toString() { - return "ItemLightSource{" + - "id=" + this.id() + - "item=" + this.item() + - ", water_sensitive=" + this.waterSensitive() + - '}'; - } - - public static @NotNull Optional fromJson(@NotNull Identifier id, @NotNull JsonObject json) { - if (!json.has("item") || !json.has("luminance")) { - LambDynLights.get().warn("Failed to parse item light source \"" + id + "\", invalid format: missing required fields."); - return Optional.empty(); - } - - var affectId = Identifier.tryParse(json.get("item").getAsString()); - var item = BuiltInRegistries.ITEM.get(affectId); - - if (item == Items.AIR) - return Optional.empty(); - - boolean waterSensitive = false; - if (json.has("water_sensitive")) - waterSensitive = json.get("water_sensitive").getAsBoolean(); - - var luminanceElement = json.get("luminance").getAsJsonPrimitive(); - if (luminanceElement.isNumber()) { - return Optional.of(new StaticItemLightSource(id, item, luminanceElement.getAsInt(), waterSensitive)); - } else if (luminanceElement.isString()) { - var luminanceStr = luminanceElement.getAsString(); - if (luminanceStr.equals("block")) { - if (item instanceof BlockItem blockItem) { - return Optional.of(new BlockItemLightSource(id, item, blockItem.getBlock().defaultState(), waterSensitive)); - } - } else { - var blockId = Identifier.tryParse(luminanceStr); - if (blockId != null) { - var block = BuiltInRegistries.BLOCK.get(blockId); - if (block != Blocks.AIR) - return Optional.of(new BlockItemLightSource(id, item, block.defaultState(), waterSensitive)); - } - } - } else { - LambDynLights.get().warn("Failed to parse item light source \"" + id + "\", invalid format: \"luminance\" field value isn't string or integer."); - } - - return Optional.empty(); - } - - public static class StaticItemLightSource extends ItemLightSource { - private final int luminance; - - public StaticItemLightSource(Identifier id, Item item, int luminance, boolean waterSensitive) { - super(id, item, waterSensitive); - this.luminance = luminance; - } - - public StaticItemLightSource(Identifier id, Item item, int luminance) { - super(id, item); - this.luminance = luminance; - } - - @Override - public int getLuminance(ItemStack stack) { - return this.luminance; - } - } - - public static class BlockItemLightSource extends ItemLightSource { - private final BlockState mimic; - - public BlockItemLightSource(Identifier id, Item item, BlockState block, boolean waterSensitive) { - super(id, item, waterSensitive); - this.mimic = block; - } - - @Override - public int getLuminance(ItemStack stack) { - return getLuminance(stack, this.mimic); - } - - static int getLuminance(ItemStack stack, BlockState state) { - var nbt = stack.getComponents().getOrDefault(DataComponents.BLOCK_STATE, BlockItemStateProperties.EMPTY); - - if (!nbt.isEmpty()) { - state = nbt.apply(state); - } - - return state.getLightEmission(); - } - } -} diff --git a/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSources.java b/src/main/java/dev/lambdaurora/lambdynlights/resource/item/ItemLightSources.java similarity index 52% rename from src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSources.java rename to src/main/java/dev/lambdaurora/lambdynlights/resource/item/ItemLightSources.java index 2fb29464..82b87736 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSources.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/resource/item/ItemLightSources.java @@ -7,33 +7,35 @@ * see the LICENSE file. */ -package dev.lambdaurora.lambdynlights.api.item; +package dev.lambdaurora.lambdynlights.resource.item; import com.google.gson.JsonParser; +import com.mojang.serialization.JsonOps; import dev.lambdaurora.lambdynlights.LambDynLights; -import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; -import net.minecraft.core.registries.BuiltInRegistries; +import dev.lambdaurora.lambdynlights.api.item.ItemLightSource; import net.minecraft.resources.Identifier; import net.minecraft.resources.io.Resource; import net.minecraft.resources.io.ResourceManager; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStreamReader; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; /** * Represents an item light sources manager. * * @author LambdAurora - * @version 2.3.2 + * @version 3.0.0 * @since 1.3.0 */ public final class ItemLightSources { - private static final Map ITEM_LIGHT_SOURCES = new Reference2ObjectOpenHashMap<>(); - private static final Map STATIC_ITEM_LIGHT_SOURCES = new Reference2ObjectOpenHashMap<>(); + private static final Logger LOGGER = LoggerFactory.getLogger("LambDynLights|ItemLightSources"); + private static final List LIGHT_SOURCES = new ArrayList<>(); private ItemLightSources() { throw new UnsupportedOperationException("ItemLightSources only contains static definitions."); @@ -45,12 +47,10 @@ private ItemLightSources() { * @param resourceManager The resource manager. */ public static void load(ResourceManager resourceManager) { - ITEM_LIGHT_SOURCES.clear(); + LIGHT_SOURCES.clear(); resourceManager.findResources("dynamiclights/item", path -> path.path().endsWith(".json")) .forEach(ItemLightSources::load); - - ITEM_LIGHT_SOURCES.putAll(STATIC_ITEM_LIGHT_SOURCES); } private static void load(Identifier resourceId, Resource resource) { @@ -58,12 +58,14 @@ private static void load(Identifier resourceId, Resource resource) { try (var reader = new InputStreamReader(resource.open())) { var json = JsonParser.parseReader(reader).getAsJsonObject(); - ItemLightSource.fromJson(id, json).ifPresent(data -> { - if (!STATIC_ITEM_LIGHT_SOURCES.containsKey(data.item())) - register(data); + var loaded = ItemLightSource.CODEC.parse(JsonOps.INSTANCE, json); + + loaded.ifError(error -> { + LOGGER.warn("[LambDynamicLights] Failed to load item light source \"{}\" due to error: {}", id, error.message()); }); + loaded.ifSuccess(LIGHT_SOURCES::add); } catch (IOException | IllegalStateException e) { - LambDynLights.get().warn("Failed to load item light source \"" + id + "\"."); + LOGGER.warn("[LambDynamicLights] Failed to load item light source \"{}\".", id, e); } } @@ -71,36 +73,36 @@ private static void load(Identifier resourceId, Resource resource) { * Registers an item light source data. * * @param data The item light source data. - */ + * private static void register(ItemLightSource data) { - var other = ITEM_LIGHT_SOURCES.get(data.item()); + var other = ITEM_LIGHT_SOURCES.get(data.item()); - if (other != null) { - LambDynLights.get().warn("Failed to register item light source \"" + data.id() + "\", duplicates item \"" - + BuiltInRegistries.ITEM.getId(data.item()) + "\" found in \"" + other.id() + "\"."); - return; - } - - ITEM_LIGHT_SOURCES.put(data.item(), data); + if (other != null) { + LambDynLights.get().warn("Failed to register item light source \"" + data.id() + "\", duplicates item \"" + + BuiltInRegistries.ITEM.getId(data.item()) + "\" found in \"" + other.id() + "\"."); + return; } + ITEM_LIGHT_SOURCES.put(data.item(), data); + }*/ + /** * Registers an item light source data. * * @param data the item light source data - */ + * public static void registerItemLightSource(ItemLightSource data) { - var other = STATIC_ITEM_LIGHT_SOURCES.get(data.item()); - - if (other != null) { - LambDynLights.get().warn("Failed to register item light source \"" + data.id() + "\", duplicates item \"" - + BuiltInRegistries.ITEM.getId(data.item()) + "\" found in \"" + other.id() + "\"."); - return; - } + var other = STATIC_ITEM_LIGHT_SOURCES.get(data.item()); - STATIC_ITEM_LIGHT_SOURCES.put(data.item(), data); + if (other != null) { + LambDynLights.get().warn("Failed to register item light source \"" + data.id() + "\", duplicates item \"" + + BuiltInRegistries.ITEM.getId(data.item()) + "\" found in \"" + other.id() + "\"."); + return; } + STATIC_ITEM_LIGHT_SOURCES.put(data.item(), data); + }*/ + /** * Returns the luminance of the item in the stack. * @@ -109,12 +111,16 @@ public static void registerItemLightSource(ItemLightSource data) { * @return a luminance value */ public static int getLuminance(ItemStack stack, boolean submergedInWater) { - var data = ITEM_LIGHT_SOURCES.get(stack.getItem()); + boolean shouldCareAboutWater = submergedInWater && LambDynLights.get().config.getWaterSensitiveCheck().get(); + + int luminance = Block.byItem(stack.getItem()).defaultState().getLightEmission(); + + for (var data : LIGHT_SOURCES) { + if (shouldCareAboutWater && data.waterSensitive()) continue; + + luminance = Math.max(luminance, data.getLuminance(stack)); + } - if (data != null) { - return data.getLuminance(stack, submergedInWater); - } else if (stack.getItem() instanceof BlockItem blockItem) - return ItemLightSource.BlockItemLightSource.getLuminance(stack, blockItem.getBlock().defaultState()); - else return 0; + return luminance; } } diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_black_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_black_table_lamp.json deleted file mode 100644 index de1c42a9..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_black_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:black_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_blue_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_blue_table_lamp.json deleted file mode 100644 index caf50496..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_blue_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:blue_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_brown_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_brown_table_lamp.json deleted file mode 100644 index 5e6b84ff..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_brown_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:brown_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_cyan_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_cyan_table_lamp.json deleted file mode 100644 index 06d896e1..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_cyan_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:cyan_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_gray_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_gray_table_lamp.json deleted file mode 100644 index 2fa698e8..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_gray_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:gray_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_green_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_green_table_lamp.json deleted file mode 100644 index 2525db79..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_green_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:green_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_light_blue_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_light_blue_table_lamp.json deleted file mode 100644 index 26fb1994..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_light_blue_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:light_blue_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_light_gray_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_light_gray_table_lamp.json deleted file mode 100644 index 48311494..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_light_gray_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:light_gray_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_lime_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_lime_table_lamp.json deleted file mode 100644 index 5a692737..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_lime_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:lime_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_magenta_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_magenta_table_lamp.json deleted file mode 100644 index 72ef624f..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_magenta_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:magenta_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_orange_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_orange_table_lamp.json deleted file mode 100644 index e9a54477..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_orange_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:orange_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_pink_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_pink_table_lamp.json deleted file mode 100644 index 582b9f5e..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_pink_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:pink_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_purple_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_purple_table_lamp.json deleted file mode 100644 index 3d74244f..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_purple_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:purple_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_red_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_red_table_lamp.json deleted file mode 100644 index 96612b2a..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_red_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:red_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_stone_torch.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_stone_torch.json index d380c5f6..fbd240f9 100644 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_stone_torch.json +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_stone_torch.json @@ -1,5 +1,9 @@ { - "item": "adorn:stone_torch", - "luminance": "block", + "match": { + "items":"adorn:stone_torch" + }, + "luminance": { + "type": "block_self" + }, "water_sensitive": true } diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_table_lamps.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_table_lamps.json new file mode 100644 index 00000000..017a0e71 --- /dev/null +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_table_lamps.json @@ -0,0 +1,26 @@ +{ + "match": { + "items": [ + "adorn:black_table_lamp", + "adorn:blue_table_lamp", + "adorn:brown_table_lamp", + "adorn:cyan_table_lamp", + "adorn:gray_table_lamp", + "adorn:green_table_lamp", + "adorn:light_blue_table_lamp", + "adorn:light_gray_table_lamp", + "adorn:lime_table_lamp", + "adorn:magenta_table_lamp", + "adorn:orange_table_lamp", + "adorn:pink_table_lamp", + "adorn:purple_table_lamp", + "adorn:red_table_lamp", + "adorn:white_table_lamp", + "adorn:yellow_table_lamp" + ] + }, + "luminance": { + "type": "block_self" + }, + "water_sensitive": true +} diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_white_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_white_table_lamp.json deleted file mode 100644 index cbf74bb7..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_white_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:white_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_yellow_table_lamp.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_yellow_table_lamp.json deleted file mode 100644 index 95987b43..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/adorn_yellow_table_lamp.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "adorn:yellow_table_lamp", - "luminance": "block", - "water_sensitive": true -} \ No newline at end of file diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/blaze.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/blaze.json new file mode 100644 index 00000000..e652c663 --- /dev/null +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/blaze.json @@ -0,0 +1,9 @@ +{ + "match": { + "items": [ + "minecraft:blaze_powder", + "minecraft:blaze_rod" + ] + }, + "luminance": 10 +} diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/blaze_powder.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/blaze_powder.json deleted file mode 100644 index 0a5678ed..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/blaze_powder.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "item": "minecraft:blaze_powder", - "luminance": 10 -} diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/blaze_rod.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/blaze_rod.json deleted file mode 100644 index 175e4994..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/blaze_rod.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "item": "minecraft:blaze_rod", - "luminance": 10 -} diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/campfire.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/campfire.json index 016dd3e1..221f70d7 100644 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/campfire.json +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/campfire.json @@ -1,5 +1,12 @@ { - "item": "minecraft:campfire", - "luminance": "block", - "water_sensitive": true + "match": { + "items": [ + "minecraft:campfire", + "minecraft:soul_campfire" + ] + }, + "luminance": { + "type": "block_self" + }, + "water_sensitive": true } diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/fire_aspect.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/fire_aspect.json new file mode 100644 index 00000000..d5cb2a1b --- /dev/null +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/fire_aspect.json @@ -0,0 +1,14 @@ +{ + "match":{ + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": [ + "minecraft:fire_aspect" + ] + } + ] + } + }, + "luminance": 15 +} diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/fire_charge.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/fire_charge.json index 83cc2967..1a44101c 100644 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/fire_charge.json +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/fire_charge.json @@ -1,5 +1,7 @@ { - "item": "minecraft:fire_charge", - "luminance": 10, - "water_sensitive": true + "match": { + "items": "minecraft:fire_charge" + }, + "luminance": 10, + "water_sensitive": true } diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/glow_berries.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/glow_berries.json index ad984b41..8e0bfce4 100644 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/glow_berries.json +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/glow_berries.json @@ -1,4 +1,6 @@ { - "item": "minecraft:glow_berries", - "luminance": 14 + "match": { + "items": "minecraft:glow_berries" + }, + "luminance": 14 } diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/glow_ink_sac.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/glow_ink_sac.json index ec5bf7fc..7585d184 100644 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/glow_ink_sac.json +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/glow_ink_sac.json @@ -1,4 +1,6 @@ { - "item": "minecraft:glow_ink_sac", - "luminance": 12 + "match": { + "items": "minecraft:glow_ink_sac" + }, + "luminance": 12 } diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/glowstone_dust.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/glowstone_dust.json index 4ffb2564..dd26acd2 100644 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/glowstone_dust.json +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/glowstone_dust.json @@ -1,4 +1,6 @@ { - "item": "minecraft:glowstone_dust", - "luminance": 8 + "match": { + "items": "minecraft:glowstone_dust" + }, + "luminance": 8 } diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/lava_bucket.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/lava_bucket.json index b1fa9437..3455c0fa 100644 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/lava_bucket.json +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/lava_bucket.json @@ -1,5 +1,10 @@ { - "item": "minecraft:lava_bucket", - "luminance": "minecraft:lava", - "water_sensitive": true + "match": { + "items": "minecraft:lava_bucket" + }, + "luminance": { + "type": "block", + "block": "minecraft:lava" + }, + "water_sensitive": true } diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/nether_star.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/nether_star.json index 9741a277..94459589 100644 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/nether_star.json +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/nether_star.json @@ -1,4 +1,6 @@ { - "item": "minecraft:nether_star", - "luminance": 8 + "match": { + "items": "minecraft:nether_star" + }, + "luminance": 8 } diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/prismarine_crystals.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/prismarine_crystals.json index 639aa140..2b4f05c5 100644 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/prismarine_crystals.json +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/prismarine_crystals.json @@ -1,4 +1,6 @@ { - "item": "minecraft:prismarine_crystals", - "luminance": 8 + "match": { + "items": "minecraft:prismarine_crystals" + }, + "luminance": 8 } diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/redstone_torch.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/redstone_torch.json deleted file mode 100644 index 3d428cea..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/redstone_torch.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "minecraft:redstone_torch", - "luminance": "block", - "water_sensitive": true -} diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/soul_campfire.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/soul_campfire.json deleted file mode 100644 index 113371ea..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/soul_campfire.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "minecraft:soul_campfire", - "luminance": "block", - "water_sensitive": true -} diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/soul_torch.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/soul_torch.json deleted file mode 100644 index b76582bf..00000000 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/soul_torch.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "item": "minecraft:soul_torch", - "luminance": "block", - "water_sensitive": true -} diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/spectral_arrow.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/spectral_arrow.json index f2449d73..28354930 100644 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/spectral_arrow.json +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/spectral_arrow.json @@ -1,4 +1,6 @@ { - "item": "minecraft:spectral_arrow", - "luminance": 10 + "match": { + "items": "minecraft:spectral_arrow" + }, + "luminance": 10 } diff --git a/src/main/resources/assets/lambdynlights/dynamiclights/item/torch.json b/src/main/resources/assets/lambdynlights/dynamiclights/item/torch.json index ccfaa663..02ba1398 100644 --- a/src/main/resources/assets/lambdynlights/dynamiclights/item/torch.json +++ b/src/main/resources/assets/lambdynlights/dynamiclights/item/torch.json @@ -1,5 +1,13 @@ { - "item": "minecraft:torch", - "luminance": "block", - "water_sensitive": true + "match": { + "items": [ + "minecraft:torch", + "minecraft:redstone_torch", + "minecraft:soul_torch" + ] + }, + "luminance": { + "type": "block_self" + }, + "water_sensitive": true }