From 0a86ecc1731852ba29d29e4590601df57b10ae0f Mon Sep 17 00:00:00 2001 From: Vojta Date: Mon, 29 Dec 2025 17:56:15 +0100 Subject: [PATCH] Add celeritas dynamic lights support --- src/main/java/dev/redstudio/fbp/FBP.java | 3 ++ .../compat/CeleritasDynamicLightsHandler.java | 41 +++++++++++++++++++ .../fbp/renderer/light/LightUtil.java | 16 ++++++-- 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 src/main/java/dev/redstudio/fbp/compat/CeleritasDynamicLightsHandler.java diff --git a/src/main/java/dev/redstudio/fbp/FBP.java b/src/main/java/dev/redstudio/fbp/FBP.java index 0ec97ea..c802751 100644 --- a/src/main/java/dev/redstudio/fbp/FBP.java +++ b/src/main/java/dev/redstudio/fbp/FBP.java @@ -14,6 +14,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.IRenderHandler; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; @@ -71,6 +72,8 @@ public final class FBP { public static final VertexFormat VERTEX_FORMAT = new VertexFormat(); + public static final boolean IS_CELERITASDYNAMICLIGHTS_LOADED = Loader.isModLoaded("celeritasdynamiclights"); + @Mod.EventHandler public void preInit(FMLPreInitializationEvent preInitializationEvent) { oldMainConfigFile = new File(preInitializationEvent.getModConfigurationDirectory() + "/fbp/Particle.properties"); diff --git a/src/main/java/dev/redstudio/fbp/compat/CeleritasDynamicLightsHandler.java b/src/main/java/dev/redstudio/fbp/compat/CeleritasDynamicLightsHandler.java new file mode 100644 index 0000000..941b21b --- /dev/null +++ b/src/main/java/dev/redstudio/fbp/compat/CeleritasDynamicLightsHandler.java @@ -0,0 +1,41 @@ +package dev.redstudio.fbp.compat; + +import net.minecraft.util.math.BlockPos; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +public class CeleritasDynamicLightsHandler { + private static MethodHandle getInstanceHandle; + private static MethodHandle getDynamicLightLevelHandle; + + static { + try { + Class cls = Class.forName("toni.sodiumdynamiclights.SodiumDynamicLights"); + + getInstanceHandle = MethodHandles.lookup().findStatic( + cls, "get", MethodType.methodType(cls) + ); + + getDynamicLightLevelHandle = MethodHandles.lookup().findVirtual( + cls, "getDynamicLightLevel", MethodType.methodType(double.class, BlockPos.class) + ); + + } catch (Exception ignored) { + + } + } + + public static int getDynamicLight(int x, int y, int z) { + if (getInstanceHandle == null || getDynamicLightLevelHandle == null) return 0; + + try { + Object instance = getInstanceHandle.invoke(); + double level = (double) getDynamicLightLevelHandle.invoke(instance, new BlockPos(x, y, z)); + return (int) level; + } catch (Throwable t) { + return 0; + } + } +} diff --git a/src/main/java/dev/redstudio/fbp/renderer/light/LightUtil.java b/src/main/java/dev/redstudio/fbp/renderer/light/LightUtil.java index b478e74..76d8bea 100644 --- a/src/main/java/dev/redstudio/fbp/renderer/light/LightUtil.java +++ b/src/main/java/dev/redstudio/fbp/renderer/light/LightUtil.java @@ -1,10 +1,12 @@ package dev.redstudio.fbp.renderer.light; +import dev.redstudio.fbp.compat.CeleritasDynamicLightsHandler; import dev.redstudio.redcore.math.MathUtil; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; +import static dev.redstudio.fbp.FBP.IS_CELERITASDYNAMICLIGHTS_LOADED; import static dev.redstudio.fbp.FBP.MC; public class LightUtil { @@ -49,6 +51,7 @@ public static int getCombinedLight(int x, int y, int z) { world = MC.player.world; chunk = world.getChunk(x >> 4, z >> 4); section = chunk.getBlockStorageArray()[y >> 4]; + int result; if (section != null) { if (section.get(x & 15, y & 15, z & 15).useNeighborBrightness()) { int light = 0; @@ -59,15 +62,22 @@ public static int getCombinedLight(int x, int y, int z) { light = getNeighborLight(world, chunk, section, x, y, z - 1, light); light = getNeighborLight(world, chunk, section, x, y, z + 1, light); light = getNeighborLight(world, chunk, section, x - 1, y, z, light); - return getNeighborLight(world, chunk, section, x + 1, y, z, light); + result = getNeighborLight(world, chunk, section, x + 1, y, z, light); } else { - return pack(world.provider.hasSkyLight() ? section.getSkyLight(x & 15, y & 15, z & 15) : 0, + result = pack(world.provider.hasSkyLight() ? section.getSkyLight(x & 15, y & 15, z & 15) : 0, section.getBlockLight(x & 15, y & 15, z & 15)); } } else { - return pack(world.provider.hasSkyLight() && y >= chunk.getHeightMap()[(z & 15) << 4 | (x & 15)] ? 15 : 0, + result = pack(world.provider.hasSkyLight() && y >= chunk.getHeightMap()[(z & 15) << 4 | (x & 15)] ? 15 : 0, 0); } + + if(IS_CELERITASDYNAMICLIGHTS_LOADED) { + int dynamic = CeleritasDynamicLightsHandler.getDynamicLight(x,y,z); + result = pack(sky(result), Math.max(block(result), dynamic)); + } + + return result; } private static int getNeighborLight(World world, Chunk chunk, ExtendedBlockStorage section, int x, int y, int z,