diff --git a/CHANGELOG.md b/CHANGELOG.md index 20f5cb84..30c199f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -202,6 +202,15 @@ - Added settings access in Sodium. - Updated Simplified Chinese translations ([#242](https://github.com/LambdAurora/LambDynamicLights/pull/242)). +## 3.2.0 + +- Updated to Minecraft 1.21.2. +- Added base light of 8 to allays. +- Improved settings GUI, especially the entity dynamic light sources list. +- Tweaked the new dynamic lighting engine introduced in 3.1.0. +- Updated Estonian translations ([#243](https://github.com/LambdAurora/LambDynamicLights/pull/243)). +- Updated [SpruceUI]. + [SpruceUI]: https://github.com/LambdAurora/SpruceUI "SpruceUI page" [pridelib]: https://github.com/Queerbric/pridelib "Pridelib page" [Sodium]: https://modrinth.com/mod/sodium "Sodium Modrinth page" diff --git a/README.md b/README.md index 10aaaea2..24262cb5 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ![Java 21](https://img.shields.io/badge/language-Java%2021-9115ff.svg?style=flat-square) -[![GitHub license](https://img.shields.io/badge/license-Lambda%20License-c7136d?style=flat-square)](https://raw.githubusercontent.com/LambdAurora/LambDynamicLights/1.21/LICENSE) +[![GitHub license](https://img.shields.io/badge/license-Lambda%20License-c7136d?style=flat-square)](https://raw.githubusercontent.com/LambdAurora/LambDynamicLights/1.21.2/LICENSE) ![Environment: Client](https://img.shields.io/badge/environment-client-1976d2?style=flat-square) [![Mod loader: Fabric]][fabric] ![Version](https://img.shields.io/github/v/tag/LambdAurora/LambDynamicLights?label=version&style=flat-square) 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 index 1d06504b..b51021c6 100644 --- a/api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSourceManager.java +++ b/api/src/main/java/dev/lambdaurora/lambdynlights/api/item/ItemLightSourceManager.java @@ -12,6 +12,7 @@ import dev.yumi.commons.event.Event; import net.minecraft.advancements.critereon.ItemPredicate; import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.Registries; import net.minecraft.resources.Identifier; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; @@ -82,7 +83,12 @@ interface RegisterContext { * @see #register(ItemLike, ItemLuminance) */ default void register(ItemLike item, int luminance) { - this.register(new ItemLightSource(ItemPredicate.Builder.item().of(item).build(), luminance)); + this.register(new ItemLightSource( + ItemPredicate.Builder.item() + .of(this.registryAccess().lookupOrThrow(Registries.ITEM), item) + .build(), + luminance + )); } /** @@ -94,7 +100,12 @@ default void register(ItemLike item, int luminance) { * @see #register(ItemLike, int) */ default void register(ItemLike item, ItemLuminance luminance) { - this.register(new ItemLightSource(ItemPredicate.Builder.item().of(item).build(), luminance)); + this.register(new ItemLightSource( + ItemPredicate.Builder.item() + .of(this.registryAccess().lookupOrThrow(Registries.ITEM), item) + .build(), + luminance + )); } } } diff --git a/build.gradle.kts b/build.gradle.kts index 9ae765c4..4bd3bf1c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -20,30 +20,14 @@ logger.lifecycle("Preparing version ${version}...") repositories { mavenLocal() - mavenCentral() maven { name = "Terraformers" url = uri("https://maven.terraformersmc.com/releases/") } - maven { - name = "Gegy" - url = uri("https://maven.gegy.dev") - } maven { name = "ParchmentMC" url = uri("https://maven.parchmentmc.org") } - exclusiveContent { - forRepository { - maven { - name = "Modrinth" - url = uri("https://api.modrinth.com/maven") - } - } - filter { - includeGroup("maven.modrinth") - } - } } loom { @@ -66,8 +50,6 @@ dependencies { this.isTransitive = false } - modRuntimeOnly(libs.sodium) - shadow(project(":api", configuration = "namedElements")) { isTransitive = false } diff --git a/build_logic/src/main/kotlin/lambdynamiclights.gradle.kts b/build_logic/src/main/kotlin/lambdynamiclights.gradle.kts index 4748a898..9985ce4d 100644 --- a/build_logic/src/main/kotlin/lambdynamiclights.gradle.kts +++ b/build_logic/src/main/kotlin/lambdynamiclights.gradle.kts @@ -21,6 +21,14 @@ loom { runtimeOnlyLog4j = true } +repositories { + mavenCentral() + maven { + name = "Gegy" + url = uri("https://maven.gegy.dev") + } +} + dependencies { minecraft(libs.minecraft) @Suppress("UnstableApiUsage") diff --git a/build_logic/src/main/kotlin/lambdynamiclights/Constants.kt b/build_logic/src/main/kotlin/lambdynamiclights/Constants.kt index ac943e51..c2ab6ddc 100644 --- a/build_logic/src/main/kotlin/lambdynamiclights/Constants.kt +++ b/build_logic/src/main/kotlin/lambdynamiclights/Constants.kt @@ -5,7 +5,7 @@ import org.gradle.accessors.dm.LibrariesForLibs object Constants { const val GROUP = "dev.lambdaurora" const val NAME = "lambdynamiclights" - const val VERSION = "3.1.0" + const val VERSION = "3.2.0" const val JAVA_VERSION = 21 private var minecraftVersion: String? = null diff --git a/build_logic/src/main/kotlin/lambdynamiclights/Utils.kt b/build_logic/src/main/kotlin/lambdynamiclights/Utils.kt index a91a3de9..d44a67c6 100644 --- a/build_logic/src/main/kotlin/lambdynamiclights/Utils.kt +++ b/build_logic/src/main/kotlin/lambdynamiclights/Utils.kt @@ -28,7 +28,7 @@ object Utils { } readme = lines.joinToString("\n") - readme = readme.replace(linkRegex.toRegex(), "![\$1](https://raw.githubusercontent.com/LambdAurora/LambDynamicLights/1.21/\$2)") + readme = readme.replace(linkRegex.toRegex(), "![\$1](https://raw.githubusercontent.com/LambdAurora/LambDynamicLights/1.21.2/\$2)") return readme } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 768f8c29..420a34ea 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,16 +1,15 @@ [versions] -minecraft = "1.21.1" -fabric-loader = "0.16.5" -fabric-api = "0.105.0+1.21.1" -mappings-yalmm = "2" +minecraft = "1.21.2" +fabric-loader = "0.16.7" +fabric-api = "0.106.1+1.21.2" +mappings-yalmm = "7" mappings-parchment = "2024.07.28" # Dependencies yumi-commons = "1.0.0-alpha.1" -spruceui = "5.1.0+1.21" -pridelib = "1.2.1+1.21" -modmenu = "11.0.1" -sodium = "mc1.21-0.5.9" +spruceui = "6.1.0+1.21.2" +pridelib = "1.3.0+1.21.2" +modmenu = "12.0.0-beta.1" # Configuration nightconfig = "3.8.1" @@ -32,7 +31,6 @@ yumi-commons-event = { module = "dev.yumi.commons:yumi-commons-event", version.r spruceui = { module = "dev.lambdaurora:spruceui", version.ref = "spruceui" } pridelib = { module = "io.github.queerbric:pridelib", version.ref = "pridelib" } modmenu = { module = "com.terraformersmc:modmenu", version.ref = "modmenu" } -sodium = { module = "maven.modrinth:sodium", version.ref = "sodium" } # Configuration nightconfig-core = { module = "com.electronwill.night-config:core", version.ref = "nightconfig" } diff --git a/src/main/java/dev/lambdaurora/lambdynlights/LambDynLights.java b/src/main/java/dev/lambdaurora/lambdynlights/LambDynLights.java index c29ea473..69a1e038 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/LambDynLights.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/LambDynLights.java @@ -25,12 +25,14 @@ import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.entrypoint.EntrypointContainer; import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LightTexture; import net.minecraft.core.BlockPos; import net.minecraft.resources.Identifier; import net.minecraft.resources.io.ResourceManager; import net.minecraft.resources.io.ResourceType; +import net.minecraft.util.profiling.Profiler; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.item.PrimedTnt; @@ -107,7 +109,7 @@ public void reload(ResourceManager manager) { }); WorldRenderEvents.START.register(context -> { - Minecraft.getInstance().getProfiler().swap("dynamic_lighting"); + Profiler.get().swap("dynamic_lighting"); this.updateAll(context.worldRenderer()); }); @@ -152,21 +154,10 @@ public int getLastUpdateCount() { * @return the modified lightmap coordinates */ public int getLightmapWithDynamicLight(@NotNull BlockAndTintGetter level, @NotNull BlockPos pos, int lightmap) { - return this.getLightmapWithDynamicLight(this.getDynamicLightLevel(pos), lightmap); - } - - /** - * Returns the lightmap with combined light levels. - * - * @param entity the entity - * @param lightmap the vanilla lightmap coordinates - * @return the modified lightmap coordinates - */ - public int getLightmapWithDynamicLight(@NotNull Entity entity, int lightmap) { - int posLightLevel = (int) this.getDynamicLightLevel(entity.getOnPos()); - int entityLuminance = ((DynamicLightSource) entity).getLuminance(); - - return this.getLightmapWithDynamicLight(Math.max(posLightLevel, entityLuminance), lightmap); + if (!(level instanceof ClientLevel)) this.lightSourcesLock.readLock().lock(); + double light = this.getDynamicLightLevel(pos); + if (!(level instanceof ClientLevel)) this.lightSourcesLock.readLock().unlock(); + return this.getLightmapWithDynamicLight(light, lightmap); } /** @@ -200,10 +191,7 @@ public int getLightmapWithDynamicLight(double dynamicLightLevel, int lightmap) { * @return the dynamic light level at the specified position */ public double getDynamicLightLevel(@NotNull BlockPos pos) { - this.lightSourcesLock.readLock().lock(); - double light = this.engine.getDynamicLightLevel(pos); - this.lightSourcesLock.readLock().unlock(); - return light; + return this.engine.getDynamicLightLevel(pos); } /** diff --git a/src/main/java/dev/lambdaurora/lambdynlights/LambDynLightsCompat.java b/src/main/java/dev/lambdaurora/lambdynlights/LambDynLightsCompat.java index f57903f7..3efd60c7 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/LambDynLightsCompat.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/LambDynLightsCompat.java @@ -10,8 +10,6 @@ package dev.lambdaurora.lambdynlights; import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.Version; -import net.fabricmc.loader.api.VersionParsingException; /** * Represents a utility class for compatibility. @@ -30,20 +28,10 @@ public static boolean isCanvasInstalled() { return FabricLoader.getInstance().isModLoaded("canvas"); } + /** + * {@return {@code true} if Sodium is installed, or {@code false} otherwise} + */ public static boolean isSodiumInstalled() { return FabricLoader.getInstance().isModLoaded("sodium"); } - - public static boolean isSodium05XInstalled() { - return FabricLoader.getInstance().getModContainer("sodium").map(mod -> { - try { - var sodium050 = Version.parse("0.5.0"); - var sodium060 = Version.parse("0.6.0-beta.1"); - return mod.getMetadata().getVersion().compareTo(sodium050) >= 0 - && mod.getMetadata().getVersion().compareTo(sodium060) < 0; - } catch (VersionParsingException e) { - throw new RuntimeException(e); - } - }).orElse(false); - } } diff --git a/src/main/java/dev/lambdaurora/lambdynlights/LambDynLightsMixinPlugin.java b/src/main/java/dev/lambdaurora/lambdynlights/LambDynLightsMixinPlugin.java index 0e77418c..addc268b 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/LambDynLightsMixinPlugin.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/LambDynLightsMixinPlugin.java @@ -29,13 +29,8 @@ public class LambDynLightsMixinPlugin implements IMixinConfigPlugin { private final Object2BooleanMap conditionalMixins = new Object2BooleanOpenHashMap<>(); public LambDynLightsMixinPlugin() { - boolean sodium05XInstalled = LambDynLightsCompat.isSodium05XInstalled(); - this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.sodium.ArrayLightDataCacheMixin", sodium05XInstalled); - this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.sodium.FlatLightPipelineMixin", sodium05XInstalled); - this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.sodium.LightDataAccessMixin", sodium05XInstalled); - this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.sodium.SodiumOptionsGuiMixin", LambDynLightsCompat.isSodiumInstalled()); - this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.DevModeMixin", LambDynLightsConstants.isDevMode()); + this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.sodium.SodiumOptionsGuiMixin", LambDynLightsCompat.isSodiumInstalled()); } @Override diff --git a/src/main/java/dev/lambdaurora/lambdynlights/accessor/DynamicLightHandlerHolder.java b/src/main/java/dev/lambdaurora/lambdynlights/accessor/DynamicLightHandlerHolder.java index 00ddcd94..664557c1 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/accessor/DynamicLightHandlerHolder.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/accessor/DynamicLightHandlerHolder.java @@ -12,6 +12,7 @@ import dev.lambdaurora.lambdynlights.api.DynamicLightHandler; import dev.lambdaurora.lambdynlights.config.LightSourceSettingEntry; import net.minecraft.network.chat.Text; +import net.minecraft.resources.Identifier; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.block.entity.BlockEntity; @@ -30,6 +31,8 @@ public interface DynamicLightHandlerHolder { Text lambdynlights$getName(); + Identifier lambdynlights$getId(); + @SuppressWarnings("unchecked") static DynamicLightHandlerHolder cast(EntityType entityType) { return (DynamicLightHandlerHolder) entityType; diff --git a/src/main/java/dev/lambdaurora/lambdynlights/api/DynamicLightHandlers.java b/src/main/java/dev/lambdaurora/lambdynlights/api/DynamicLightHandlers.java index f8c4e532..ddc4b35d 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/api/DynamicLightHandlers.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/api/DynamicLightHandlers.java @@ -20,7 +20,7 @@ /** * @author LambdAurora - * @version 3.0.0 + * @version 3.2.0 * @since 1.1.0 */ public final class DynamicLightHandlers { @@ -32,6 +32,7 @@ private DynamicLightHandlers() { * Registers the default handlers. */ public static void registerDefaultHandlers() { + registerDynamicLightHandler(EntityType.ALLAY, DynamicLightHandler.makeHandler(blaze -> 8, blaze -> true)); registerDynamicLightHandler(EntityType.BLAZE, DynamicLightHandler.makeHandler(blaze -> 10, blaze -> true)); registerDynamicLightHandler(EntityType.CREEPER, DynamicLightHandler.makeCreeperEntityHandler(null)); registerDynamicLightHandler(EntityType.ENDERMAN, entity -> { diff --git a/src/main/java/dev/lambdaurora/lambdynlights/config/LightSourceSettingEntry.java b/src/main/java/dev/lambdaurora/lambdynlights/config/LightSourceSettingEntry.java index aa0f5f7b..72d3da04 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/config/LightSourceSettingEntry.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/config/LightSourceSettingEntry.java @@ -13,6 +13,7 @@ import dev.lambdaurora.spruceui.SpruceTexts; import dev.lambdaurora.spruceui.option.SpruceBooleanOption; import dev.lambdaurora.spruceui.option.SpruceOption; +import dev.lambdaurora.spruceui.option.SpruceToggleBooleanOption; import net.minecraft.TextFormatting; import net.minecraft.network.chat.Text; import org.jetbrains.annotations.Nullable; @@ -39,16 +40,14 @@ protected SpruceOption buildOption(@Nullable Text tooltip) { ); } - public static final class Option extends SpruceBooleanOption { + public static final class Option extends SpruceToggleBooleanOption { public Option(String key, Supplier getter, Consumer setter, @Nullable Text tooltip) { - super(key, getter, setter, tooltip, true); + super(key, getter, setter, tooltip); } @Override public Text getDisplayText() { - boolean value = this.get(); - return SpruceTexts.getToggleText(value).copy() - .withStyle(value ? TextFormatting.GREEN : TextFormatting.RED); + return Text.empty(); } } } diff --git a/src/main/java/dev/lambdaurora/lambdynlights/engine/DynamicLightingEngine.java b/src/main/java/dev/lambdaurora/lambdynlights/engine/DynamicLightingEngine.java index 2973ec50..fd4b4f1f 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/engine/DynamicLightingEngine.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/engine/DynamicLightingEngine.java @@ -30,7 +30,7 @@ public final class DynamicLightingEngine { private static final double MAX_RADIUS = 7.75; private static final double MAX_RADIUS_SQUARED = MAX_RADIUS * MAX_RADIUS; private static final int CELL_SIZE = MathHelper.ceil(MAX_RADIUS); - private static final int MAX_LIGHT_SOURCES = 1024; + public static final int MAX_LIGHT_SOURCES = 1024; private static final Vec3i[] CELL_OFFSETS; private final SpatialLookupEntry[] spatialLookupEntries = new SpatialLookupEntry[MAX_LIGHT_SOURCES]; diff --git a/src/main/java/dev/lambdaurora/lambdynlights/gui/LightSourceListWidget.java b/src/main/java/dev/lambdaurora/lambdynlights/gui/LightSourceListWidget.java index 5c7ba137..e306d8bd 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/gui/LightSourceListWidget.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/gui/LightSourceListWidget.java @@ -22,44 +22,103 @@ import dev.lambdaurora.spruceui.widget.WithBackground; import dev.lambdaurora.spruceui.widget.container.SpruceEntryListWidget; import dev.lambdaurora.spruceui.widget.container.SpruceParentWidget; +import dev.lambdaurora.spruceui.widget.text.SpruceTextFieldWidget; +import net.minecraft.TextFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.narration.NarratedElementType; import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.network.chat.Style; import net.minecraft.network.chat.Text; +import net.minecraft.util.FormattedCharSequence; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.stream.Stream; public class LightSourceListWidget extends SpruceEntryListWidget { private static final Background HIGHLIGHT_BACKGROUND = new SimpleColorBackground(128, 128, 128, 24); + private final List entries = new ArrayList<>(); private int lastIndex = 0; - public LightSourceListWidget(Position position, int width, int height) { + public LightSourceListWidget(Position position, int width, int height, SpruceTextFieldWidget searchBar) { super(position, width, height, 4, LightSourceEntry.class); + + searchBar.setChangedListener(this::update); + searchBar.setRenderTextProvider((input, firstCharacterIndex) -> { + if (this.children().isEmpty()) { + return FormattedCharSequence.forward(input, Style.EMPTY.withColor(TextFormatting.RED)); + } + + var list = Stream.of(input.split(" ")) + .map(part -> part.startsWith("@") + ? Text.literal(part + " ").withStyle(TextFormatting.AQUA) + : Text.literal(part + " ") + ) + .map(Text::getVisualOrderText) + .toList(); + return FormattedCharSequence.fromList(list); + }); + } + + private void update(@Nullable String filter) { + if (filter == null) { + this.replaceEntries(this.entries); + } else { + final var entryFilter = List.of(filter.toLowerCase().split("\\s")); + this.replaceEntries(this.entries.stream().filter(entry -> this.checkFilter(entry, entryFilter)).toList()); + } + + for (int i = 0; i < this.children().size(); i++) { + var entry = this.children().get(i); + if (i % 2 != 0) + entry.setBackground(HIGHLIGHT_BACKGROUND); + else + entry.setBackground(EmptyBackground.EMPTY_BACKGROUND); + } + } + + private boolean checkFilter(LightSourceEntry entry, @NotNull List filter) { + var name = entry.option.lambdynlights$getName().getString().toLowerCase(); + + for (var part : filter) { + if (part.startsWith("@")) { + // Namespace + if (!entry.option.lambdynlights$getId().namespace().startsWith(part.substring(1))) { + return false; + } + + continue; + } + + if (!name.contains(part)) { + return false; + } + } + + return true; } /** * Adds a single option entry. The option will use all the width available. * * @param holder the option - * @return the index of the added entry */ - public int addEntry(DynamicLightHandlerHolder holder) { + private void addEntry(DynamicLightHandlerHolder holder) { if (holder.lambdynlights$getSetting() != null) { var entry = LightSourceEntry.create(this, holder); - int index = this.addEntry(entry); - if (index % 2 != 0) - entry.setBackground(HIGHLIGHT_BACKGROUND); - return index; + this.entries.add(entry); } - return -1; } public void addAll(List> types) { - for (var type : types) - this.addEntry(type); + types.stream() + .sorted(Comparator.comparing(handler -> handler.lambdynlights$getName().getString())) + .forEach(this::addEntry); + this.update(null); } /* Narration */ @@ -89,19 +148,21 @@ public void updateNarration(NarrationElementOutput builder) { public static class LightSourceEntry extends Entry implements SpruceParentWidget, WithBackground { private final List children = new ArrayList<>(); private final LightSourceListWidget parent; + private final DynamicLightHandlerHolder option; private @Nullable SpruceWidget focused; private boolean dragging; private Background background = EmptyBackground.EMPTY_BACKGROUND; - private LightSourceEntry(LightSourceListWidget parent) { + private LightSourceEntry(LightSourceListWidget parent, DynamicLightHandlerHolder option) { this.parent = parent; + this.option = option; } public static LightSourceEntry create(LightSourceListWidget parent, DynamicLightHandlerHolder option) { - var entry = new LightSourceEntry(parent); + var entry = new LightSourceEntry(parent, option); var setting = option.lambdynlights$getSetting(); - entry.children.add(new SpruceLabelWidget(Position.of(entry, entry.getWidth() / 2 - 155, 7), option.lambdynlights$getName(), 175)); - entry.children.add(setting.getOption().createWidget(Position.of(entry, entry.getWidth() / 2 + 60, 2), 75)); + entry.children.add(new SpruceLabelWidget(Position.of(entry, entry.getWidth() / 2 - 145, 7), option.lambdynlights$getName(), 175)); + entry.children.add(setting.getOption().createWidget(Position.of(entry, entry.getWidth() / 2 + 70, 2), 32)); return entry; } diff --git a/src/main/java/dev/lambdaurora/lambdynlights/gui/RandomPrideFlagBackground.java b/src/main/java/dev/lambdaurora/lambdynlights/gui/RandomPrideFlagBackground.java index 48b99921..00fa4a67 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/gui/RandomPrideFlagBackground.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/gui/RandomPrideFlagBackground.java @@ -9,20 +9,15 @@ package dev.lambdaurora.lambdynlights.gui; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; import dev.lambdaurora.spruceui.background.Background; import dev.lambdaurora.spruceui.background.SimpleColorBackground; -import dev.lambdaurora.spruceui.util.ColorUtil; import dev.lambdaurora.spruceui.widget.SpruceWidget; +import io.github.queerbric.pride.PrideClient; import io.github.queerbric.pride.PrideFlag; import io.github.queerbric.pride.PrideFlagShapes; import io.github.queerbric.pride.PrideFlags; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.GameRenderer; import net.minecraft.resources.Identifier; -import org.joml.Matrix4f; -import org.joml.Vector4f; import java.util.Random; @@ -32,7 +27,7 @@ * If you have an issue with this, I don't care. * * @author LambdAurora - * @version 2.1.0 + * @version 3.2.0 * @since 2.1.0 */ public class RandomPrideFlagBackground implements Background { @@ -50,56 +45,49 @@ public void render(GuiGraphics graphics, SpruceWidget widget, int vOffset, int m int x = widget.getX(); int y = widget.getY(); - RenderSystem.setShader(GameRenderer::getPositionColorShader); if (this.flag.getShape() == PrideFlagShapes.get(Identifier.of("pride", "horizontal_stripes"))) { - var model = graphics.matrixStack().peek().model(); - var tessellator = Tessellator.getInstance(); - var vertices = tessellator.begin(VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.POSITION_COLOR); + graphics.drawSpecial(bufferSource -> { + var buffer = bufferSource.getBuffer(PrideClient.FLAG_SHAPE_TRIANGLE_RENDER_TYPE); - int width = widget.getWidth(); - int height = widget.getHeight(); + int width = widget.getWidth(); + int height = widget.getHeight(); - float partHeight = height / (this.flag.getColors().size() - 1.f); + float partHeight = height / (this.flag.getColors().size() - 1.f); - // First one - float rightY = y; - float leftY = y; + // First one + float rightY = y; + float leftY = y; - int[] color = ColorUtil.unpackARGBColor(this.flag.getColors().getInt(0)); - vertex(vertices, model, x + width, rightY + partHeight, 0).color(color[0], color[1], color[2], color[3]); - vertex(vertices, model, x + width, rightY, 0).color(color[0], color[1], color[2], color[3]); - vertex(vertices, model, x, leftY, 0).color(color[0], color[1], color[2], color[3]); + int color = this.flag.getColors().getInt(0); + buffer.addVertex(x + width, rightY + partHeight, 0).color(color); + buffer.addVertex(x + width, rightY, 0).color(color); + buffer.addVertex(x, leftY, 0).color(color); - rightY += partHeight; + rightY += partHeight; - for (int i = 1; i < this.flag.getColors().size() - 1; i++) { - color = ColorUtil.unpackARGBColor(this.flag.getColors().getInt(i)); + for (int i = 1; i < this.flag.getColors().size() - 1; i++) { + color = this.flag.getColors().getInt(i); - vertex(vertices, model, x + width, rightY + partHeight, 0).color(color[0], color[1], color[2], color[3]); - vertex(vertices, model, x + width, rightY, 0).color(color[0], color[1], color[2], color[3]); - vertex(vertices, model, x, leftY, 0).color(color[0], color[1], color[2], color[3]); + buffer.addVertex(x + width, rightY + partHeight, 0).color(color); + buffer.addVertex(x + width, rightY, 0).color(color); + buffer.addVertex(x, leftY, 0).color(color); - vertex(vertices, model, x + width, rightY + partHeight, 0).color(color[0], color[1], color[2], color[3]); - vertex(vertices, model, x, leftY, 0).color(color[0], color[1], color[2], color[3]); - vertex(vertices, model, x, leftY + partHeight, 0).color(color[0], color[1], color[2], color[3]); + buffer.addVertex(x + width, rightY + partHeight, 0).color(color); + buffer.addVertex(x, leftY, 0).color(color); + buffer.addVertex(x, leftY + partHeight, 0).color(color); - rightY += partHeight; - leftY += partHeight; - } - - // Last one - color = ColorUtil.unpackARGBColor(this.flag.getColors().getInt(this.flag.getColors().size() - 1)); - vertex(vertices, model, x + width, rightY, 0).color(color[0], color[1], color[2], color[3]); - vertex(vertices, model, x, leftY, 0).color(color[0], color[1], color[2], color[3]); - vertex(vertices, model, x, y + height, 0).color(color[0], color[1], color[2], color[3]); - - MeshData builtBuffer = vertices.build(); - if (builtBuffer != null) { - BufferUploader.drawWithShader(builtBuffer); - } - tessellator.clear(); + rightY += partHeight; + leftY += partHeight; + } + + // Last one + color = this.flag.getColors().getInt(this.flag.getColors().size() - 1); + buffer.addVertex(x + width, rightY, 0).color(color); + buffer.addVertex(x, leftY, 0).color(color); + buffer.addVertex(x, y + height, 0).color(color); + }); } else { - this.flag.render(graphics.matrixStack(), x, y, widget.getWidth(), widget.getHeight()); + this.flag.render(graphics, x, y, widget.getWidth(), widget.getHeight()); } SECOND_LAYER.render(graphics, widget, vOffset, mouseX, mouseY, delta); @@ -113,9 +101,4 @@ public void render(GuiGraphics graphics, SpruceWidget widget, int vOffset, int m public static Background random() { return new RandomPrideFlagBackground(PrideFlags.getRandomFlag(RANDOM)); } - - private static VertexConsumer vertex(BufferBuilder builder, Matrix4f matrix, float x, float y, float z) { - Vector4f vector4f = matrix.transform(new Vector4f(x, y, z, 1.0f)); - return builder.addVertex(vector4f.x(), vector4f.y(), vector4f.z()); - } } diff --git a/src/main/java/dev/lambdaurora/lambdynlights/gui/SettingsScreen.java b/src/main/java/dev/lambdaurora/lambdynlights/gui/SettingsScreen.java index cacb2073..2daff303 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/gui/SettingsScreen.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/gui/SettingsScreen.java @@ -12,38 +12,39 @@ import dev.lambdaurora.lambdynlights.DynamicLightsConfig; import dev.lambdaurora.lambdynlights.ExplosiveLightingMode; import dev.lambdaurora.lambdynlights.LambDynLights; -import dev.lambdaurora.lambdynlights.LambDynLightsCompat; import dev.lambdaurora.lambdynlights.accessor.DynamicLightHandlerHolder; import dev.lambdaurora.spruceui.Position; import dev.lambdaurora.spruceui.SpruceTexts; import dev.lambdaurora.spruceui.background.Background; -import dev.lambdaurora.spruceui.background.DirtTexturedBackground; import dev.lambdaurora.spruceui.option.SpruceCyclingOption; import dev.lambdaurora.spruceui.option.SpruceOption; import dev.lambdaurora.spruceui.option.SpruceSeparatorOption; import dev.lambdaurora.spruceui.option.SpruceSimpleActionOption; import dev.lambdaurora.spruceui.screen.SpruceScreen; -import dev.lambdaurora.spruceui.util.RenderUtil; import dev.lambdaurora.spruceui.widget.SpruceButtonWidget; import dev.lambdaurora.spruceui.widget.SpruceLabelWidget; import dev.lambdaurora.spruceui.widget.container.SpruceContainerWidget; import dev.lambdaurora.spruceui.widget.container.SpruceOptionListWidget; +import dev.lambdaurora.spruceui.widget.container.SpruceParentWidget; import dev.lambdaurora.spruceui.widget.container.tabbed.SpruceTabbedWidget; +import dev.lambdaurora.spruceui.widget.text.SpruceTextFieldWidget; import net.minecraft.TextFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Text; +import net.minecraft.world.entity.EntityType; import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.function.Consumer; import java.util.stream.Collectors; /** * Represents the settings screen of LambDynamicLights. * * @author LambdAurora - * @version 3.0.0 + * @version 3.2.0 * @since 1.0.0 */ public class SettingsScreen extends SpruceScreen { @@ -58,6 +59,7 @@ public class SettingsScreen extends SpruceScreen { private final SpruceOption tntLightingOption; private final SpruceOption resetOption; private SpruceTabbedWidget tabbedWidget; + private SpruceTextFieldWidget searchInput; public SettingsScreen(@Nullable Screen parent) { super(Text.translatable("lambdynlights.menu.title")); @@ -104,7 +106,13 @@ protected void init() { var dynamicLightSources = Text.translatable(DYNAMIC_LIGHT_SOURCES_KEY); - this.tabbedWidget = new SpruceTabbedWidget(Position.origin(), this.width, this.height, null, Math.max(100, this.width / 8), 0); + int tabIndex = 0; + if (this.tabbedWidget != null) { + var oldEntry = this.tabbedWidget.getList().getCurrentTab(); + tabIndex = this.tabbedWidget.getList().children().indexOf(oldEntry); + } + + this.tabbedWidget = new SpruceTabbedWidget(Position.origin(), this.width, this.height, this.title.copy(), Math.max(100, this.width / 8)); this.tabbedWidget.getList().setBackground(RandomPrideFlagBackground.random()); this.tabbedWidget.addTabEntry(Text.translatable("lambdynlights.menu.tabs.general"), null, this.tabContainerBuilder(this::buildGeneralTab)); @@ -112,80 +120,80 @@ protected void init() { this.tabbedWidget.addTabEntry(Text.empty().append(dynamicLightSources).append(": ").append(this.entitiesOption.getPrefix()), null, this.tabContainerBuilder(this::buildEntitiesTab)); this.addWidget(this.tabbedWidget); + + if (tabIndex > 0 && this.tabbedWidget.getList().children().get(tabIndex) instanceof SpruceTabbedWidget.TabEntry tabEntry) { + this.tabbedWidget.getList().setSelected(tabEntry); + } } - private SpruceTabbedWidget.ContainerFactory tabContainerBuilder(SpruceTabbedWidget.ContainerFactory innerFactory) { + private SpruceTabbedWidget.ContainerFactory tabContainerBuilder(Consumer innerFactory) { return (width, height) -> this.buildTabContainer(width, height, innerFactory); } - private SpruceContainerWidget buildTabContainer(int width, int height, SpruceTabbedWidget.ContainerFactory factory) { + private SpruceContainerWidget buildTabContainer(int width, int height, Consumer tabConsumer) { var container = new SpruceContainerWidget(Position.origin(), width, height); - var label = new SpruceLabelWidget(Position.of(0, 18), this.title.copy().withStyle(TextFormatting.WHITE), width); - label.setCentered(true); - container.addChild(label); - - var innerWidget = factory.build(width, height - this.getTextHeight() - 29 - - (LambDynLightsCompat.isCanvasInstalled() ? 43 : 0)); - innerWidget.getPosition().setRelativeY(43); - container.addChild(innerWidget); - - container.setBackground((graphics, widget, vOffset, mouseX, mouseY, delta) -> { - if (this.client.level != null) { - graphics.fillGradient(widget.getX(), widget.getY(), - widget.getX() + widget.getWidth(), innerWidget.getY(), - 0xc0101010, 0xd0101010); - graphics.fillGradient(widget.getX(), innerWidget.getY() + innerWidget.getHeight(), - widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight(), - 0xc0101010, 0xd0101010); - } else { - var bg = (DirtTexturedBackground) DirtTexturedBackground.NORMAL; - RenderUtil.renderBackgroundTexture(widget.getX(), widget.getY(), - widget.getWidth(), innerWidget.getY() - widget.getY(), - vOffset / 32.f, bg.red(), bg.green(), bg.blue(), bg.alpha()); - RenderUtil.renderBackgroundTexture(widget.getX(), innerWidget.getY() + innerWidget.getHeight(), - widget.getWidth(), widget.getHeight() - (innerWidget.getY() + innerWidget.getHeight()), - vOffset / 32.f, bg.red(), bg.green(), bg.blue(), bg.alpha()); - } - }); - if (LambDynLightsCompat.isCanvasInstalled()) { - var firstLine = new SpruceLabelWidget(Position.of(0, height - 29 - (5 + this.font.lineHeight) * 3), - Text.translatable("lambdynlights.menu.canvas.1"), width); - firstLine.setCentered(true); - container.addChild(firstLine); - label = new SpruceLabelWidget(Position.of(0, firstLine.getY() + firstLine.getHeight() + 5), - Text.translatable("lambdynlights.menu.canvas.2"), width); - label.setCentered(true); - container.addChild(label); - } + tabConsumer.accept(new TabContext( + this.tabbedWidget, + container, + height - this.tabbedWidget.getList().getPosition().getRelativeY() - 40 + )); container.addChild(this.resetOption.createWidget(Position.of(this, width / 2 - 155, height - 29), 150)); container.addChild(new SpruceButtonWidget(Position.of(this, width / 2 - 155 + 160, height - 29), 150, 20, SpruceTexts.GUI_DONE, - btn -> this.client.setScreen(this.parent))); + btn -> this.client.setScreen(this.parent) + )); return container; } - private SpruceOptionListWidget buildGeneralTab(int width, int height) { - var list = new SpruceOptionListWidget(Position.of(0, 0), width, height); - list.setBackground(INNER_BACKGROUND); + private void buildGeneralTab(TabContext context) { + var list = new SpruceOptionListWidget(Position.of(0, 0), context.width(), context.height()); list.addSingleOptionEntry(this.config.dynamicLightsModeOption); list.addSingleOptionEntry(new SpruceSeparatorOption(DYNAMIC_LIGHT_SOURCES_KEY, true, null)); list.addOptionEntry(this.entitiesOption, this.selfOption); list.addOptionEntry(this.waterSensitiveOption, null); list.addOptionEntry(this.creeperLightingOption, this.tntLightingOption); - return list; + context.addInnerWidget(list); } - private LightSourceListWidget buildEntitiesTab(int width, int height) { - return this.buildLightSourcesTab(width, height, BuiltInRegistries.ENTITY_TYPE.stream().map(DynamicLightHandlerHolder::cast).collect(Collectors.toList())); + private void buildEntitiesTab(TabContext context) { + this.buildLightSourcesTab(context, BuiltInRegistries.ENTITY_TYPE.stream().map(DynamicLightHandlerHolder::cast).collect(Collectors.toList())); } - private LightSourceListWidget buildLightSourcesTab(int width, int height, List> entries) { - var list = new LightSourceListWidget(Position.of(0, 0), width, height); - list.setBackground(INNER_BACKGROUND); + private void buildLightSourcesTab(TabContext context, List> entries) { + var oldSearch = this.searchInput != null ? this.searchInput.getText() : ""; + this.searchInput = context.addSearchInput(); + var list = new LightSourceListWidget(Position.of(0, 0), context.width(), context.height(), this.searchInput); list.addAll(entries); - return list; + context.addInnerWidget(list); + this.searchInput.setText(oldSearch); + } + + record TabContext(SpruceTabbedWidget tabbedWidget, SpruceContainerWidget container, int height) { + int width() { + return this.container().getWidth(); + } + + SpruceTextFieldWidget addSearchInput() { + var searchText = Text.translatable("lambdynlights.menu.search"); + var textWidth = Minecraft.getInstance().font.width(searchText); + int searchInputX = this.width() - 140; + + this.container.addChild(new SpruceLabelWidget(Position.of(searchInputX - 4 - textWidth, 8), searchText, textWidth)); + + var searchInput = SpruceTextFieldWidget.builder(Position.of(searchInputX, 4), 136, 20) + .title(Text.literal("Search")) + .placeholder(EntityType.BLAZE.getDescription().copy().withStyle(TextFormatting.GRAY, TextFormatting.ITALIC)) + .build(); + this.container().addChild(searchInput); + return searchInput; + } + + void addInnerWidget(SpruceParentWidget widget) { + widget.getPosition().setRelativeY(this.tabbedWidget.getList().getPosition().getRelativeY()); + this.container().addChild(widget); + } } } diff --git a/src/main/java/dev/lambdaurora/lambdynlights/mixin/CommonLevelRendererMixin.java b/src/main/java/dev/lambdaurora/lambdynlights/mixin/CommonLevelRendererMixin.java index ec6b94c5..80c8de9e 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/mixin/CommonLevelRendererMixin.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/mixin/CommonLevelRendererMixin.java @@ -33,7 +33,7 @@ public abstract class CommonLevelRendererMixin implements WorldRendererAccessor cancellable = true ) private static void onGetLightmapCoordinates(BlockAndTintGetter level, BlockState state, BlockPos pos, CallbackInfoReturnable cir) { - if (!level.getBlockState(pos).isSolidRender(level, pos) && LambDynLights.get().config.getDynamicLightsMode().isEnabled()) + if (!level.getBlockState(pos).isSolidRender() && LambDynLights.get().config.getDynamicLightsMode().isEnabled()) cir.setReturnValue(LambDynLights.get().getLightmapWithDynamicLight(level, pos, cir.getReturnValue())); } } diff --git a/src/main/java/dev/lambdaurora/lambdynlights/mixin/DebugScreenOverlayMixin.java b/src/main/java/dev/lambdaurora/lambdynlights/mixin/DebugScreenOverlayMixin.java index 0e1a4496..15fbf720 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/mixin/DebugScreenOverlayMixin.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/mixin/DebugScreenOverlayMixin.java @@ -10,6 +10,7 @@ package dev.lambdaurora.lambdynlights.mixin; import dev.lambdaurora.lambdynlights.LambDynLights; +import dev.lambdaurora.lambdynlights.engine.DynamicLightingEngine; import net.minecraft.TextFormatting; import net.minecraft.client.gui.components.DebugScreenOverlay; import org.spongepowered.asm.mixin.Mixin; @@ -23,7 +24,7 @@ * Adds a debug string for dynamic light sources tracking and updates. * * @author LambdAurora - * @version 1.3.2 + * @version 3.2.0 * @since 1.3.2 */ @Mixin(DebugScreenOverlay.class) @@ -34,6 +35,8 @@ private void onGetLeftText(CallbackInfoReturnable> cir) { var ldl = LambDynLights.get(); var builder = new StringBuilder("Dynamic Light Sources: "); builder.append(ldl.getLightSourcesCount()) + .append("/") + .append(DynamicLightingEngine.MAX_LIGHT_SOURCES) .append(" (U: ") .append(ldl.getLastUpdateCount()); diff --git a/src/main/java/dev/lambdaurora/lambdynlights/mixin/DevModeMixin.java b/src/main/java/dev/lambdaurora/lambdynlights/mixin/DevModeMixin.java index 8bdf8dda..28ad8ed4 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/mixin/DevModeMixin.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/mixin/DevModeMixin.java @@ -14,12 +14,14 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.GameRenderer; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @Mixin(GameRenderer.class) public class DevModeMixin { + @Final @Shadow private Minecraft minecraft; @@ -32,8 +34,10 @@ private void handler(GuiGraphics graphics, Operation original) { int bottom = this.minecraft.getWindow().getGuiScaledHeight(); int y = bottom - this.minecraft.font.lineHeight; - graphics.fill(0, y - 4, this.minecraft.font.width(text) + 4, bottom, 0xaa000000); - graphics.drawShadowedText(this.minecraft.font, text, 2, y - 2, 0xff0000); + if (this.minecraft.isGameLoadFinished()) { + graphics.fill(0, y - 4, this.minecraft.font.width(text) + 4, bottom, 0xaa000000); + graphics.drawShadowedText(this.minecraft.font, text, 2, y - 2, 0xff0000); + } original.call(graphics); } } diff --git a/src/main/java/dev/lambdaurora/lambdynlights/mixin/EntityTypeMixin.java b/src/main/java/dev/lambdaurora/lambdynlights/mixin/EntityTypeMixin.java index c5f60ae8..cd8611f8 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/mixin/EntityTypeMixin.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/mixin/EntityTypeMixin.java @@ -15,6 +15,7 @@ import dev.lambdaurora.lambdynlights.config.LightSourceSettingEntry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Text; +import net.minecraft.resources.Identifier; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import org.jetbrains.annotations.Nullable; @@ -68,4 +69,10 @@ public abstract class EntityTypeMixin implements DynamicLightH } return name; } + + @SuppressWarnings("rawtypes") + @Override + public Identifier lambdynlights$getId() { + return EntityType.getKey((EntityType) (Object) this); + } } diff --git a/src/main/java/dev/lambdaurora/lambdynlights/mixin/fabric/AoCalculatorMixin.java b/src/main/java/dev/lambdaurora/lambdynlights/mixin/fabric/AoCalculatorMixin.java index c4bdad0e..c30c9671 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/mixin/fabric/AoCalculatorMixin.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/mixin/fabric/AoCalculatorMixin.java @@ -26,7 +26,7 @@ public abstract class AoCalculatorMixin { @Dynamic @Inject(method = "getLightmapCoordinates", at = @At(value = "RETURN", ordinal = 0), require = 0, cancellable = true, remap = false) private static void onGetLightmapCoordinates(BlockAndTintGetter level, BlockState state, BlockPos pos, CallbackInfoReturnable cir) { - if (!level.getBlockState(pos).isSolidRender(level, pos) && LambDynLights.get().config.getDynamicLightsMode().isEnabled()) + if (!level.getBlockState(pos).isSolidRender() && LambDynLights.get().config.getDynamicLightsMode().isEnabled()) cir.setReturnValue(LambDynLights.get().getLightmapWithDynamicLight(level, pos, cir.getReturnValue())); } } diff --git a/src/main/java/dev/lambdaurora/lambdynlights/mixin/sodium/ArrayLightDataCacheMixin.java b/src/main/java/dev/lambdaurora/lambdynlights/mixin/sodium/ArrayLightDataCacheMixin.java deleted file mode 100644 index 1bcf54a9..00000000 --- a/src/main/java/dev/lambdaurora/lambdynlights/mixin/sodium/ArrayLightDataCacheMixin.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright © 2023 LambdAurora - * - * This file is part of LambDynamicLights. - * - * Licensed under the Lambda License. For more information, - * see the LICENSE file. - */ - -package dev.lambdaurora.lambdynlights.mixin.sodium; - -import dev.lambdaurora.lambdynlights.LambDynLights; -import dev.lambdaurora.lambdynlights.util.SodiumDynamicLightHandler; -import org.spongepowered.asm.mixin.Dynamic; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Pseudo -@Mixin(targets = "me.jellysquid.mods.sodium.client.model.light.data.ArrayLightDataCache", remap = false) -public abstract class ArrayLightDataCacheMixin { - @Dynamic - @Inject(method = "get(III)I", at = @At("HEAD"), require = 0) - private void lambdynlights$storeLightPos(int x, int y, int z, CallbackInfoReturnable cir) { - if (!LambDynLights.get().config.getDynamicLightsMode().isEnabled()) - return; - - // Store the current light position. - // This is possible under smooth lighting scenarios, because AoFaceData in Sodium runs a get() call - // before getting the lightmap. - SodiumDynamicLightHandler.POS.get().set(x, y, z); - } -} diff --git a/src/main/java/dev/lambdaurora/lambdynlights/mixin/sodium/FlatLightPipelineMixin.java b/src/main/java/dev/lambdaurora/lambdynlights/mixin/sodium/FlatLightPipelineMixin.java deleted file mode 100644 index 71c9ba50..00000000 --- a/src/main/java/dev/lambdaurora/lambdynlights/mixin/sodium/FlatLightPipelineMixin.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright © 2023 LambdAurora - * - * This file is part of LambDynamicLights. - * - * Licensed under the Lambda License. For more information, - * see the LICENSE file. - */ - -package dev.lambdaurora.lambdynlights.mixin.sodium; - -import dev.lambdaurora.lambdynlights.util.SodiumDynamicLightHandler; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import org.spongepowered.asm.mixin.Dynamic; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -@Pseudo -@Mixin(targets = "me.jellysquid.mods.sodium.client.model.light.flat.FlatLightPipeline", remap = false) -public abstract class FlatLightPipelineMixin { - @Dynamic - @Inject( - method = "getOffsetLightmap", - at = @At(value = "RETURN", ordinal = 1), - require = 0, - remap = false, - locals = LocalCapture.CAPTURE_FAILHARD, - cancellable = true - ) - private void lambdynlights$getLightmap( - BlockPos pos, Direction face, CallbackInfoReturnable cir, - int word, int adjWord - ) { - int lightmap = SodiumDynamicLightHandler.getLightmap(pos, adjWord, cir.getReturnValueI()); - cir.setReturnValue(lightmap); - } -} diff --git a/src/main/java/dev/lambdaurora/lambdynlights/mixin/sodium/LightDataAccessMixin.java b/src/main/java/dev/lambdaurora/lambdynlights/mixin/sodium/LightDataAccessMixin.java deleted file mode 100644 index 7cc54a63..00000000 --- a/src/main/java/dev/lambdaurora/lambdynlights/mixin/sodium/LightDataAccessMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright © 2023 LambdAurora - * - * This file is part of LambDynamicLights. - * - * Licensed under the Lambda License. For more information, - * see the LICENSE file. - */ - -package dev.lambdaurora.lambdynlights.mixin.sodium; - -import dev.lambdaurora.lambdynlights.util.SodiumDynamicLightHandler; -import org.spongepowered.asm.mixin.Dynamic; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Pseudo -@Mixin(targets = "me.jellysquid.mods.sodium.client.model.light.data.LightDataAccess", remap = false) -public abstract class LightDataAccessMixin { - @Dynamic - @Inject(method = "getLightmap", at = @At("RETURN"), remap = false, require = 0, cancellable = true) - private static void lambdynlights$getLightmap(int word, CallbackInfoReturnable cir) { - int lightmap = SodiumDynamicLightHandler.getLightmap(SodiumDynamicLightHandler.POS.get(), word, cir.getReturnValueI()); - cir.setReturnValue(lightmap); - } -} diff --git a/src/main/java/dev/lambdaurora/lambdynlights/mixin/sodium/SodiumOptionsGuiMixin.java b/src/main/java/dev/lambdaurora/lambdynlights/mixin/sodium/SodiumOptionsGuiMixin.java index 3a059663..2c4ccfa2 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/mixin/sodium/SodiumOptionsGuiMixin.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/mixin/sodium/SodiumOptionsGuiMixin.java @@ -22,13 +22,7 @@ import java.util.List; @Pseudo -@Mixin( - targets = { - "me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI", - "net.caffeinemc.mods.sodium.client.gui.SodiumOptionsGUI" - }, - remap = false -) +@Mixin(targets = "net.caffeinemc.mods.sodium.client.gui.SodiumOptionsGUI", remap = false) public class SodiumOptionsGuiMixin extends Screen { @Shadow(remap = false) @Final diff --git a/src/main/java/dev/lambdaurora/lambdynlights/util/SodiumDynamicLightHandler.java b/src/main/java/dev/lambdaurora/lambdynlights/util/SodiumDynamicLightHandler.java deleted file mode 100644 index a967ca8e..00000000 --- a/src/main/java/dev/lambdaurora/lambdynlights/util/SodiumDynamicLightHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright © 2023 LambdAurora - * - * This file is part of LambDynamicLights. - * - * Licensed under the Lambda License. For more information, - * see the LICENSE file. - */ - -package dev.lambdaurora.lambdynlights.util; - -import dev.lambdaurora.lambdynlights.LambDynLights; -import net.minecraft.core.BlockPos; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Internal -public interface SodiumDynamicLightHandler { - // Stores the current light position being used by ArrayLightDataCache#get - // We use ThreadLocal because Sodium's chunk builder is multithreaded, otherwise it will break - // catastrophically. - ThreadLocal POS = ThreadLocal.withInitial(BlockPos.Mutable::new); - - static int getLightmap(BlockPos pos, int word, int lightmap) { - if (!LambDynLights.get().config.getDynamicLightsMode().isEnabled()) - return lightmap; - - // Equivalent to world.getBlockState(pos).isOpaqueFullCube(world, pos) - if (/*LightDataAccess.unpackFO(word)*/ (word >>> 30 & 1) != 0) - return lightmap; - - double dynamic = LambDynLights.get().getDynamicLightLevel(pos); - return LambDynLights.get().getLightmapWithDynamicLight(dynamic, lightmap); - } -} diff --git a/src/main/java/dev/lambdaurora/lambdynlights/util/SodiumOptionPage.java b/src/main/java/dev/lambdaurora/lambdynlights/util/SodiumOptionPage.java index 412c5ca2..7d0282a8 100644 --- a/src/main/java/dev/lambdaurora/lambdynlights/util/SodiumOptionPage.java +++ b/src/main/java/dev/lambdaurora/lambdynlights/util/SodiumOptionPage.java @@ -10,7 +10,6 @@ package dev.lambdaurora.lambdynlights.util; import com.google.common.collect.ImmutableList; -import dev.lambdaurora.lambdynlights.LambDynLightsCompat; import net.minecraft.network.chat.Text; import java.lang.invoke.MethodHandle; @@ -36,9 +35,7 @@ public static Object makeSodiumOptionPage(Text text) { static { try { - Class optionPage = LambDynLightsCompat.isSodium05XInstalled() - ? Class.forName("me.jellysquid.mods.sodium.client.gui.options.OptionPage") - : Class.forName("net.caffeinemc.mods.sodium.client.gui.options.OptionPage"); + Class optionPage = Class.forName("net.caffeinemc.mods.sodium.client.gui.options.OptionPage"); CREATE_OPTION_PAGE = MethodHandles.lookup().unreflectConstructor(optionPage.getConstructor(Text.class, ImmutableList.class)); } catch (IllegalAccessException | NoSuchMethodException | ClassNotFoundException e) { throw new RuntimeException(e); diff --git a/src/main/resources/assets/lambdynlights/lang/en_us.json b/src/main/resources/assets/lambdynlights/lang/en_us.json index 7199a457..923142b9 100644 --- a/src/main/resources/assets/lambdynlights/lang/en_us.json +++ b/src/main/resources/assets/lambdynlights/lang/en_us.json @@ -4,6 +4,7 @@ "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.menu.tabs.general": "General", + "lambdynlights.menu.search": "Search:", "lambdynlights.option.light_sources.block_entities": "Block Entities", "lambdynlights.option.light_sources.entities": "Entities", "lambdynlights.option.light_sources.self": "First-person", @@ -17,5 +18,6 @@ "lambdynlights.tooltip.mode.3": "%s is smooth dynamic lighting.", "lambdynlights.tooltip.self_light_source": "Enables first-person dynamic lighting. It's recommended to disable this if you're using shaders that has their own 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." + "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.", + "modmenu.bluesky": "Bluesky" } \ 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 936815f7..18b9633b 100644 --- a/src/main/resources/assets/lambdynlights/lang/fr_ca.json +++ b/src/main/resources/assets/lambdynlights/lang/fr_ca.json @@ -4,6 +4,7 @@ "lambdynlights.menu.canvas.1": "La désactivation de l'éclairage dynamique provenant des entités est recommendée avec Canvas !", "lambdynlights.menu.canvas.2": "L'éclairage dynamique avec Canvas est actuellement très demandant en ressources !", "lambdynlights.menu.tabs.general": "Général", + "lambdynlights.menu.search": "Recherche:", "lambdynlights.option.light_sources.block_entities": "Entités de blocs", "lambdynlights.option.light_sources.entities": "Entités", "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 936815f7..18b9633b 100644 --- a/src/main/resources/assets/lambdynlights/lang/fr_fr.json +++ b/src/main/resources/assets/lambdynlights/lang/fr_fr.json @@ -4,6 +4,7 @@ "lambdynlights.menu.canvas.1": "La désactivation de l'éclairage dynamique provenant des entités est recommendée avec Canvas !", "lambdynlights.menu.canvas.2": "L'éclairage dynamique avec Canvas est actuellement très demandant en ressources !", "lambdynlights.menu.tabs.general": "Général", + "lambdynlights.menu.search": "Recherche:", "lambdynlights.option.light_sources.block_entities": "Entités de blocs", "lambdynlights.option.light_sources.entities": "Entités", "lambdynlights.option.light_sources.self": "Première personne", diff --git a/src/main/resources/assets/lambdynlights/lang/pl_pl.json b/src/main/resources/assets/lambdynlights/lang/pl_pl.json index 542f9f0a..4a16598b 100644 --- a/src/main/resources/assets/lambdynlights/lang/pl_pl.json +++ b/src/main/resources/assets/lambdynlights/lang/pl_pl.json @@ -4,6 +4,7 @@ "lambdynlights.menu.canvas.1": "Wyłączenie dynamicznego oświetlenia dla bytów jest zalecane w przypadku użycia Canvas! ", "lambdynlights.menu.canvas.2": "Na tą chwilę dynamiczne oświetlenie użyte z Canvasem powoduje spadek wydajności!", "lambdynlights.menu.tabs.general": "Ogólne", + "lambdynlights.menu.search": "Szukaj:", "lambdynlights.option.light_sources.block_entities": "Byty bloków", "lambdynlights.option.light_sources.entities": "Byty", "lambdynlights.option.light_sources.self": "Pierwsza osoba", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index db539976..0a3133b8 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -30,13 +30,13 @@ ], "depends": { "fabricloader": ">=0.16.5", - "fabric-api": ">=0.100.4+1.21", - "minecraft": "~1.21", - "spruceui": ">=5.1.0", + "fabric-api": ">=0.106.1+1.21.2", + "minecraft": ">=1.21.2", + "spruceui": ">=6.1.0", "java": ">=21" }, "recommends": { - "modmenu": ">=11.0.0" + "modmenu": ">=12.0.0-beta.1" }, "suggests": { "ears": "*", @@ -52,6 +52,7 @@ "modmenu.discord": "https://discord.lambdaurora.dev/", "modmenu.github_releases": "https://github.com/LambdAurora/LambDynamicLights/releases", "modmenu.modrinth": "https://modrinth.com/mod/lambdynamiclights", + "modmenu.bluesky": "https://bsky.app/profile/lambdaurora.dev", "modmenu.twitter": "https://twitter.com/LambdAurora" } }, diff --git a/src/main/resources/lambdynlights.mixins.json b/src/main/resources/lambdynlights.mixins.json index 4545df78..f7b10dd0 100644 --- a/src/main/resources/lambdynlights.mixins.json +++ b/src/main/resources/lambdynlights.mixins.json @@ -12,9 +12,6 @@ "EntityTypeMixin", "MinecraftClientMixin", "VideoSettingsScreenMixin", - "sodium.ArrayLightDataCacheMixin", - "sodium.FlatLightPipelineMixin", - "sodium.LightDataAccessMixin", "sodium.SodiumOptionsGuiMixin", "fabric.AoCalculatorMixin" ],