Skip to content

Commit 7f0c1f5

Browse files
committed
LambDynamicLights v3.1.0
- Optimize dynamic light lookup thanks to @Akarys42. - Added support for falling block entities #93. - Added settings access in Sodium.
1 parent 3c45415 commit 7f0c1f5

23 files changed

+413
-138
lines changed

CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,13 @@
195195

196196
- Fixed crash due to Mixin plugin ([#239](https://github.com/LambdAurora/LambDynamicLights/issues/239)).
197197

198+
## 3.1.0
199+
200+
- Improved general performances, especially in worst-case scenarios.
201+
- Added support for falling block entities ([#93](https://github.com/LambdAurora/LambDynamicLights/issues/93)).
202+
- Added settings access in Sodium.
203+
- Updated Simplified Chinese translations ([#242](https://github.com/LambdAurora/LambDynamicLights/pull/242)).
204+
198205
[SpruceUI]: https://github.com/LambdAurora/SpruceUI "SpruceUI page"
199206
[pridelib]: https://github.com/Queerbric/pridelib "Pridelib page"
200207
[Sodium]: https://modrinth.com/mod/sodium "Sodium Modrinth page"

README.md

+8-10
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<!-- modrinth_exclude.start -->
44
![Java 21](https://img.shields.io/badge/language-Java%2021-9115ff.svg?style=flat-square) <!-- modrinth_exclude.end -->
5-
[![GitHub license](https://img.shields.io/badge/license-Lambda%20License-c7136d?style=flat-square)](https://raw.githubusercontent.com/LambdAurora/LambDynamicLights/1.19/LICENSE)
5+
[![GitHub license](https://img.shields.io/badge/license-Lambda%20License-c7136d?style=flat-square)](https://raw.githubusercontent.com/LambdAurora/LambDynamicLights/1.21/LICENSE)
66
![Environment: Client](https://img.shields.io/badge/environment-client-1976d2?style=flat-square)
77
[![Mod loader: Fabric]][fabric] <!-- modrinth_exclude.start -->
88
![Version](https://img.shields.io/github/v/tag/LambdAurora/LambDynamicLights?label=version&style=flat-square)
@@ -47,31 +47,31 @@ Searching other mods to replace OptiFine? [Check out this list!](https://optifin
4747

4848
Dropped items which already emit light as a block, will also dynamically emit light!
4949

50-
![Torch](https://media.forgecdn.net/attachments/301/21/2020-07-04_22.png)
50+
![Torch](images/torch.png)
5151

5252
### Held items emit light
5353

5454
Light is emitted when entities hold light emitting items.
5555

56-
![Fox holding lantern](https://media.forgecdn.net/attachments/301/22/2020-07-04_22.png)
56+
![Fox holding lantern](images/fox_holding_lantern.png)
5757

5858
### Fire! Fire! Fire!
5959

6060
Any entity on fire will emit light!
6161

62-
![Skeleton on fire!](https://media.forgecdn.net/attachments/301/23/2020-07-04_22.png)
62+
![Skeleton on fire!](images/fire_skeleton.png)
6363

6464
### Spectral arrows
6565

6666
Spectral arrows will emit a very weak light!
6767

68-
![Spectral arrows](https://media.forgecdn.net/attachments/301/25/2020-07-04_22.png)
68+
![Spectral arrows](images/spectral_arrow.png)
6969

7070
### Different luminance!
7171

7272
Light emitted from items depend on the light emitted from their respective blocks!
7373

74-
![light levels](https://media.forgecdn.net/attachments/301/26/2020-07-04_22.png)
74+
![light levels](images/light_levels.png)
7575

7676
### Configuration GUI
7777

@@ -99,11 +99,11 @@ Just do `./gradlew build` and everything should build just fine!
9999

100100
## 📖 How does it work internally?
101101

102-
Check [this documentation](https://github.com/LambdAurora/LambDynamicLights/blob/1.17/HOW_DOES_IT_WORK.md).
102+
Check [this documentation](https://github.com/LambdAurora/LambDynamicLights/blob/1.21/HOW_DOES_IT_WORK.md).
103103

104104
## 📖 Is there an API? How to use it as a developer?
105105

106-
Check [this documentation](https://github.com/LambdAurora/LambDynamicLights/blob/1.17/API.md).
106+
Check [this documentation](https://github.com/LambdAurora/LambDynamicLights/blob/1.21/API.md).
107107

108108
<!-- modrinth_exclude.long_start -->
109109
## Downloads
@@ -132,13 +132,11 @@ GitHub
132132
# 📖 Compatibility
133133

134134
- [Sodium] is recommended for better performances.
135-
- [Canvas] is compatible but still WIP: expect huge lag spike with it until a proper lighting API is done in Canvas.
136135
- **OptiFabric is obviously incompatible.**
137136

138137
[fabric]: https://fabricmc.net
139138
[Mod loader: Fabric]: https://img.shields.io/badge/modloader-Fabric-1976d2?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTEyLTE2VDE2OjU0OjE3LTA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wNy0yOFQyMToxNzo0OC0wNzowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wNy0yOFQyMToxNzo0OC0wNzowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowZWRiMWMyYy1mZjhjLWU0NDEtOTMxZi00OTVkNGYxNGM3NjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MGVkYjFjMmMtZmY4Yy1lNDQxLTkzMWYtNDk1ZDRmMTRjNzYwIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MGVkYjFjMmMtZmY4Yy1lNDQxLTkzMWYtNDk1ZDRmMTRjNzYwIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowZWRiMWMyYy1mZjhjLWU0NDEtOTMxZi00OTVkNGYxNGM3NjAiIHN0RXZ0OndoZW49IjIwMTgtMTItMTZUMTY6NTQ6MTctMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4/HiGMAAAAtUlEQVRYw+XXrQqAMBQF4D2P2eBL+QIG8RnEJFaNBjEum+0+zMQLtwwv+wV3ZzhhMDgfJ0wUSinxZUQWgKos1JP/AbD4OneIDyQPwCFniA+EJ4CaXm4TxAXCC0BNHgLhAdAnx9hC8PwGSRtAFVMQjF7cNTWED8B1cgwW20yfJgAvrssAsZ1cB3g/xckAxr6FmCDU5N6f488BrpCQ4rQBJkiMYh4ACmLzwOQF0CExinkCsvw7vgGikl+OotaKRwAAAABJRU5ErkJggg==
140139
[Fabric API]: https://www.curseforge.com/minecraft/mc-mods/fabric-api "Fabric API CurseForge page"
141140
[ModMenu]: https://modrinth.com/mod/modmenu
142141
[Sodium]: https://www.curseforge.com/minecraft/mc-mods/sodium "Sodium CurseForge page"
143-
[Canvas]: https://www.curseforge.com/minecraft/mc-mods/canvas-renderer "Canvas CurseForge page"
144142
[LambdAurora Discord]: https://discord.lambdaurora.dev

build_logic/src/main/kotlin/lambdynamiclights/Constants.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import org.gradle.accessors.dm.LibrariesForLibs
55
object Constants {
66
const val GROUP = "dev.lambdaurora"
77
const val NAME = "lambdynamiclights"
8-
const val VERSION = "3.0.1"
8+
const val VERSION = "3.1.0"
99
const val JAVA_VERSION = 21
1010

1111
private var minecraftVersion: String? = null

images/fire_skeleton.png

792 KB
Loading

images/fox_holding_lantern.png

499 KB
Loading

images/light_levels.png

760 KB
Loading

images/spectral_arrow.png

316 KB
Loading

images/torch.png

558 KB
Loading

src/main/java/dev/lambdaurora/lambdynlights/LambDynLights.java

+30-72
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@
1212
import dev.lambdaurora.lambdynlights.accessor.WorldRendererAccessor;
1313
import dev.lambdaurora.lambdynlights.api.DynamicLightHandlers;
1414
import dev.lambdaurora.lambdynlights.api.DynamicLightsInitializer;
15+
import dev.lambdaurora.lambdynlights.engine.DynamicLightingEngine;
1516
import dev.lambdaurora.lambdynlights.resource.item.ItemLightSources;
1617
import dev.yumi.commons.event.EventManager;
1718
import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
1819
import net.fabricmc.api.ClientModInitializer;
20+
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
1921
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
22+
import net.fabricmc.fabric.api.event.lifecycle.v1.CommonLifecycleEvents;
2023
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
2124
import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener;
2225
import net.fabricmc.loader.api.FabricLoader;
@@ -28,19 +31,21 @@
2831
import net.minecraft.resources.Identifier;
2932
import net.minecraft.resources.io.ResourceManager;
3033
import net.minecraft.resources.io.ResourceType;
31-
import net.minecraft.util.math.MathHelper;
3234
import net.minecraft.world.entity.Entity;
3335
import net.minecraft.world.entity.LivingEntity;
3436
import net.minecraft.world.entity.item.PrimedTnt;
3537
import net.minecraft.world.entity.monster.Creeper;
3638
import net.minecraft.world.entity.player.Player;
3739
import net.minecraft.world.item.ItemStack;
40+
import net.minecraft.world.level.BlockAndTintGetter;
3841
import org.jetbrains.annotations.NotNull;
3942
import org.jetbrains.annotations.Nullable;
4043
import org.slf4j.Logger;
4144
import org.slf4j.LoggerFactory;
4245

46+
import java.util.ArrayList;
4347
import java.util.HashSet;
48+
import java.util.List;
4449
import java.util.Set;
4550
import java.util.concurrent.locks.ReentrantReadWriteLock;
4651
import java.util.function.Predicate;
@@ -49,18 +54,18 @@
4954
* Represents the LambDynamicLights mod.
5055
*
5156
* @author LambdAurora
52-
* @version 3.0.1
57+
* @version 3.1.0
5358
* @since 1.0.0
5459
*/
5560
public class LambDynLights implements ClientModInitializer {
5661
private static final Logger LOGGER = LoggerFactory.getLogger("LambDynamicLights");
57-
private static final double MAX_RADIUS = 7.75;
58-
private static final double MAX_RADIUS_SQUARED = MAX_RADIUS * MAX_RADIUS;
5962
public static final EventManager<Identifier> EVENT_MANAGER = new EventManager<>(Identifier.of(LambDynLightsConstants.NAMESPACE, "default"), Identifier::parse);
6063
private static LambDynLights INSTANCE;
6164
public final DynamicLightsConfig config = new DynamicLightsConfig(this);
6265
public final ItemLightSources itemLightSources = new ItemLightSources();
66+
private final DynamicLightingEngine engine = new DynamicLightingEngine();
6367
private final Set<DynamicLightSource> dynamicLightSources = new HashSet<>();
68+
private final List<DynamicLightSource> toClear = new ArrayList<>();
6469
private final ReentrantReadWriteLock lightSourcesLock = new ReentrantReadWriteLock();
6570
private long lastUpdate = System.currentTimeMillis();
6671
private int lastUpdateCount = 0;
@@ -89,6 +94,18 @@ public void reload(ResourceManager manager) {
8994
}
9095
});
9196

97+
CommonLifecycleEvents.TAGS_LOADED.register((registries, client) -> {
98+
this.itemLightSources.apply(registries);
99+
});
100+
101+
ClientTickEvents.END_WORLD_TICK.register(level -> {
102+
this.lightSourcesLock.writeLock().lock();
103+
this.engine.computeSpatialLookup(this.dynamicLightSources);
104+
this.toClear.forEach(source -> source.lambdynlights$scheduleTrackedChunksRebuild(Minecraft.getInstance().levelRenderer));
105+
this.toClear.clear();
106+
this.lightSourcesLock.writeLock().unlock();
107+
});
108+
92109
WorldRenderEvents.START.register(context -> {
93110
Minecraft.getInstance().getProfiler().swap("dynamic_lighting");
94111
this.updateAll(context.worldRenderer());
@@ -111,11 +128,9 @@ public void updateAll(@NotNull LevelRenderer renderer) {
111128
this.lastUpdate = now;
112129
this.lastUpdateCount = 0;
113130

114-
this.lightSourcesLock.readLock().lock();
115131
for (var lightSource : this.dynamicLightSources) {
116132
if (lightSource.lambdynlights$updateDynamicLight(renderer)) this.lastUpdateCount++;
117133
}
118-
this.lightSourcesLock.readLock().unlock();
119134
}
120135
}
121136

@@ -131,11 +146,12 @@ public int getLastUpdateCount() {
131146
/**
132147
* Returns the lightmap with combined light levels.
133148
*
149+
* @param level the level in which the light is computed
134150
* @param pos the position
135151
* @param lightmap the vanilla lightmap coordinates
136152
* @return the modified lightmap coordinates
137153
*/
138-
public int getLightmapWithDynamicLight(@NotNull BlockPos pos, int lightmap) {
154+
public int getLightmapWithDynamicLight(@NotNull BlockAndTintGetter level, @NotNull BlockPos pos, int lightmap) {
139155
return this.getLightmapWithDynamicLight(this.getDynamicLightLevel(pos), lightmap);
140156
}
141157

@@ -184,44 +200,10 @@ public int getLightmapWithDynamicLight(double dynamicLightLevel, int lightmap) {
184200
* @return the dynamic light level at the specified position
185201
*/
186202
public double getDynamicLightLevel(@NotNull BlockPos pos) {
187-
double result = 0;
188203
this.lightSourcesLock.readLock().lock();
189-
for (var lightSource : this.dynamicLightSources) {
190-
result = maxDynamicLightLevel(pos, lightSource, result);
191-
}
204+
double light = this.engine.getDynamicLightLevel(pos);
192205
this.lightSourcesLock.readLock().unlock();
193-
194-
return MathHelper.clamp(result, 0, 15);
195-
}
196-
197-
/**
198-
* Returns the dynamic light level generated by the light source at the specified position.
199-
*
200-
* @param pos the position
201-
* @param lightSource the light source
202-
* @param currentLightLevel the current surrounding dynamic light level
203-
* @return the dynamic light level at the specified position
204-
*/
205-
public static double maxDynamicLightLevel(@NotNull BlockPos pos, @NotNull DynamicLightSource lightSource, double currentLightLevel) {
206-
int luminance = lightSource.getLuminance();
207-
if (luminance > 0) {
208-
// Can't use Entity#squaredDistanceTo because of eye Y coordinate.
209-
double dx = pos.getX() - lightSource.getDynamicLightX() + 0.5;
210-
double dy = pos.getY() - lightSource.getDynamicLightY() + 0.5;
211-
double dz = pos.getZ() - lightSource.getDynamicLightZ() + 0.5;
212-
213-
double distanceSquared = dx * dx + dy * dy + dz * dz;
214-
// 7.75 because else we would have to update more chunks and that's not a good idea.
215-
// 15 (max range for blocks) would be too much and a bit cheaty.
216-
if (distanceSquared <= MAX_RADIUS_SQUARED) {
217-
double multiplier = 1.0 - Math.sqrt(distanceSquared) / MAX_RADIUS;
218-
double lightLevel = multiplier * (double) luminance;
219-
if (lightLevel > currentLightLevel) {
220-
return lightLevel;
221-
}
222-
}
223-
}
224-
return currentLightLevel;
206+
return light;
225207
}
226208

227209
/**
@@ -236,9 +218,7 @@ public void addLightSource(@NotNull DynamicLightSource lightSource) {
236218
return;
237219
if (this.containsLightSource(lightSource))
238220
return;
239-
this.lightSourcesLock.writeLock().lock();
240221
this.dynamicLightSources.add(lightSource);
241-
this.lightSourcesLock.writeLock().unlock();
242222
}
243223

244224
/**
@@ -251,11 +231,7 @@ public boolean containsLightSource(@NotNull DynamicLightSource lightSource) {
251231
if (!lightSource.getDynamicLightLevel().isClientSide())
252232
return false;
253233

254-
boolean result;
255-
this.lightSourcesLock.readLock().lock();
256-
result = this.dynamicLightSources.contains(lightSource);
257-
this.lightSourcesLock.readLock().unlock();
258-
return result;
234+
return this.dynamicLightSources.contains(lightSource);
259235
}
260236

261237
/**
@@ -264,13 +240,7 @@ public boolean containsLightSource(@NotNull DynamicLightSource lightSource) {
264240
* @return the number of dynamic light sources emitting light
265241
*/
266242
public int getLightSourcesCount() {
267-
int result;
268-
269-
this.lightSourcesLock.readLock().lock();
270-
result = this.dynamicLightSources.size();
271-
this.lightSourcesLock.readLock().unlock();
272-
273-
return result;
243+
return this.dynamicLightSources.size();
274244
}
275245

276246
/**
@@ -279,39 +249,31 @@ public int getLightSourcesCount() {
279249
* @param lightSource the light source to remove
280250
*/
281251
public void removeLightSource(@NotNull DynamicLightSource lightSource) {
282-
this.lightSourcesLock.writeLock().lock();
283-
284252
var dynamicLightSources = this.dynamicLightSources.iterator();
285253
DynamicLightSource it;
286254
while (dynamicLightSources.hasNext()) {
287255
it = dynamicLightSources.next();
288256
if (it.equals(lightSource)) {
289257
dynamicLightSources.remove();
290-
lightSource.lambdynlights$scheduleTrackedChunksRebuild(Minecraft.getInstance().levelRenderer);
258+
this.toClear.add(lightSource);
291259
break;
292260
}
293261
}
294-
295-
this.lightSourcesLock.writeLock().unlock();
296262
}
297263

298264
/**
299265
* Clears light sources.
300266
*/
301267
public void clearLightSources() {
302-
this.lightSourcesLock.writeLock().lock();
303-
304268
var dynamicLightSources = this.dynamicLightSources.iterator();
305269
DynamicLightSource it;
306270
while (dynamicLightSources.hasNext()) {
307271
it = dynamicLightSources.next();
308272
dynamicLightSources.remove();
309273
if (it.getLuminance() > 0)
310274
it.resetDynamicLight();
311-
it.lambdynlights$scheduleTrackedChunksRebuild(Minecraft.getInstance().levelRenderer);
275+
this.toClear.add(it);
312276
}
313-
314-
this.lightSourcesLock.writeLock().unlock();
315277
}
316278

317279
/**
@@ -320,8 +282,6 @@ public void clearLightSources() {
320282
* @param filter the removal filter
321283
*/
322284
public void removeLightSources(@NotNull Predicate<DynamicLightSource> filter) {
323-
this.lightSourcesLock.writeLock().lock();
324-
325285
var dynamicLightSources = this.dynamicLightSources.iterator();
326286
DynamicLightSource it;
327287
while (dynamicLightSources.hasNext()) {
@@ -330,12 +290,10 @@ public void removeLightSources(@NotNull Predicate<DynamicLightSource> filter) {
330290
dynamicLightSources.remove();
331291
if (it.getLuminance() > 0)
332292
it.resetDynamicLight();
333-
it.lambdynlights$scheduleTrackedChunksRebuild(Minecraft.getInstance().levelRenderer);
293+
this.toClear.add(it);
334294
break;
335295
}
336296
}
337-
338-
this.lightSourcesLock.writeLock().unlock();
339297
}
340298

341299
/**

src/main/java/dev/lambdaurora/lambdynlights/LambDynLightsCompat.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* Represents a utility class for compatibility.
1818
*
1919
* @author LambdAurora
20-
* @version 3.0.0
20+
* @version 3.1.0
2121
* @since 1.0.0
2222
*/
2323
public final class LambDynLightsCompat {
@@ -30,6 +30,10 @@ public static boolean isCanvasInstalled() {
3030
return FabricLoader.getInstance().isModLoaded("canvas");
3131
}
3232

33+
public static boolean isSodiumInstalled() {
34+
return FabricLoader.getInstance().isModLoaded("sodium");
35+
}
36+
3337
public static boolean isSodium05XInstalled() {
3438
return FabricLoader.getInstance().getModContainer("sodium").map(mod -> {
3539
try {

src/main/java/dev/lambdaurora/lambdynlights/LambDynLightsMixinPlugin.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* LambDynamicLights mixin plugin for conditional mixins.
2323
*
2424
* @author LambdAurora
25-
* @version 3.0.1
25+
* @version 3.1.0
2626
* @since 1.0.0
2727
*/
2828
public class LambDynLightsMixinPlugin implements IMixinConfigPlugin {
@@ -33,6 +33,7 @@ public LambDynLightsMixinPlugin() {
3333
this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.sodium.ArrayLightDataCacheMixin", sodium05XInstalled);
3434
this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.sodium.FlatLightPipelineMixin", sodium05XInstalled);
3535
this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.sodium.LightDataAccessMixin", sodium05XInstalled);
36+
this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.sodium.SodiumOptionsGuiMixin", LambDynLightsCompat.isSodiumInstalled());
3637

3738
this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.DevModeMixin", LambDynLightsConstants.isDevMode());
3839
}

0 commit comments

Comments
 (0)