From 87de096bee1866cf1cea07c8de3dac6fbd65ba2b Mon Sep 17 00:00:00 2001 From: Liopyu Date: Tue, 23 Jun 2026 00:38:54 -0400 Subject: [PATCH 1/3] - Fix server crash from block tint function client types --- .../mods/kubejs/block/BlockTintFunction.java | 15 ++++++------- .../kubejs/client/ClientBlockTintColors.java | 22 +++++++++++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 src/main/java/dev/latvian/mods/kubejs/client/ClientBlockTintColors.java diff --git a/src/main/java/dev/latvian/mods/kubejs/block/BlockTintFunction.java b/src/main/java/dev/latvian/mods/kubejs/block/BlockTintFunction.java index ad8b1ae50..38dd7b87f 100644 --- a/src/main/java/dev/latvian/mods/kubejs/block/BlockTintFunction.java +++ b/src/main/java/dev/latvian/mods/kubejs/block/BlockTintFunction.java @@ -3,6 +3,7 @@ import dev.latvian.mods.kubejs.color.KubeColor; import dev.latvian.mods.kubejs.color.SimpleColor; import dev.latvian.mods.kubejs.color.SimpleColorWithAlpha; +import dev.latvian.mods.kubejs.client.ClientBlockTintColors; import dev.latvian.mods.kubejs.plugin.builtin.wrapper.ColorWrapper; import dev.latvian.mods.rhino.BaseFunction; import dev.latvian.mods.rhino.Context; @@ -11,8 +12,6 @@ import dev.latvian.mods.rhino.type.TypeInfo; import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.renderer.BiomeColors; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.core.BlockPos; import net.minecraft.world.level.FoliageColor; import net.minecraft.world.level.GrassColor; @@ -28,7 +27,7 @@ public interface BlockTintFunction { TypeInfo TYPE_INFO = TypeInfo.of(BlockTintFunction.class); @Nullable - KubeColor getColor(BlockState state, @Nullable BlockAndTintGetter level, @Nullable BlockPos pos, int index); + KubeColor getColor(BlockState state, @Nullable Object level, @Nullable BlockPos pos, int index); default int getMaxTintIndex() { return 0; @@ -36,7 +35,7 @@ default int getMaxTintIndex() { record Fixed(KubeColor color) implements BlockTintFunction { @Override - public KubeColor getColor(BlockState state, @Nullable BlockAndTintGetter level, @Nullable BlockPos pos, int index) { + public KubeColor getColor(BlockState state, @Nullable Object level, @Nullable BlockPos pos, int index) { return color; } } @@ -45,7 +44,7 @@ class Mapped implements BlockTintFunction { public final Int2ObjectMap<@Nullable BlockTintFunction> map = new Int2ObjectArrayMap<>(1); @Override - public @Nullable KubeColor getColor(BlockState state, @Nullable BlockAndTintGetter level, @Nullable BlockPos pos, int index) { + public @Nullable KubeColor getColor(BlockState state, @Nullable Object level, @Nullable BlockPos pos, int index) { var f = map.get(index); return f == null ? null : f.getColor(state, level, pos, index); } @@ -62,13 +61,13 @@ public int getMaxTintIndex() { } } - BlockTintFunction GRASS = (s, l, p, i) -> new SimpleColor(l == null || p == null ? GrassColor.get(0.5, 1.0) : BiomeColors.getAverageGrassColor(l, p)); + BlockTintFunction GRASS = (s, l, p, i) -> new SimpleColor(l == null || p == null ? GrassColor.get(0.5, 1.0) : ClientBlockTintColors.getAverageGrassColor(l, p)); KubeColor DEFAULT_FOLIAGE_COLOR = new SimpleColor(FoliageColor.FOLIAGE_DEFAULT); - BlockTintFunction FOLIAGE = (s, l, p, i) -> l == null || p == null ? DEFAULT_FOLIAGE_COLOR : new SimpleColor(BiomeColors.getAverageFoliageColor(l, p)); + BlockTintFunction FOLIAGE = (s, l, p, i) -> l == null || p == null ? DEFAULT_FOLIAGE_COLOR : new SimpleColor(ClientBlockTintColors.getAverageFoliageColor(l, p)); Fixed EVERGREEN_FOLIAGE = new Fixed(new SimpleColor(FoliageColor.FOLIAGE_EVERGREEN)); Fixed BIRCH_FOLIAGE = new Fixed(new SimpleColor(FoliageColor.FOLIAGE_BIRCH)); Fixed MANGROVE_FOLIAGE = new Fixed(new SimpleColor(FoliageColor.FOLIAGE_MANGROVE)); - BlockTintFunction WATER = (s, l, p, i) -> l == null || p == null ? null : new SimpleColorWithAlpha(BiomeColors.getAverageWaterColor(l, p)); + BlockTintFunction WATER = (s, l, p, i) -> l == null || p == null ? null : new SimpleColorWithAlpha(ClientBlockTintColors.getAverageWaterColor(l, p)); @Nullable KubeColor[] REDSTONE_COLORS = new KubeColor[16]; BlockTintFunction REDSTONE = (state, level, pos, index) -> { if (REDSTONE_COLORS[0] == null) { diff --git a/src/main/java/dev/latvian/mods/kubejs/client/ClientBlockTintColors.java b/src/main/java/dev/latvian/mods/kubejs/client/ClientBlockTintColors.java new file mode 100644 index 000000000..c4277a46e --- /dev/null +++ b/src/main/java/dev/latvian/mods/kubejs/client/ClientBlockTintColors.java @@ -0,0 +1,22 @@ +package dev.latvian.mods.kubejs.client; + +import net.minecraft.client.renderer.BiomeColors; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.core.BlockPos; + +public final class ClientBlockTintColors { + private ClientBlockTintColors() { + } + + public static int getAverageGrassColor(Object level, BlockPos pos) { + return BiomeColors.getAverageGrassColor((BlockAndTintGetter) level, pos); + } + + public static int getAverageFoliageColor(Object level, BlockPos pos) { + return BiomeColors.getAverageFoliageColor((BlockAndTintGetter) level, pos); + } + + public static int getAverageWaterColor(Object level, BlockPos pos) { + return BiomeColors.getAverageWaterColor((BlockAndTintGetter) level, pos); + } +} From 3519d0e34842f930c2f932b785fcc5b26c9ce98e Mon Sep 17 00:00:00 2001 From: Liopyu Date: Tue, 23 Jun 2026 00:44:49 -0400 Subject: [PATCH 2/3] - Updated changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d63bf794..a29fe95eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ # changelog ## Unreleased -- / + +- Fix dedicated server crash from block tint function client types (#1159) ## [8.0.3] - 2026-06-22 From 201a7cb1b0ec0afc8ad124c06c23eebde93cbad8 Mon Sep 17 00:00:00 2001 From: Liopyu Date: Tue, 23 Jun 2026 01:26:31 -0400 Subject: [PATCH 3/3] - Changed arg type from Object to BlockAndLightGetter - Moved client logic to BlockTintFunctionWrapper --- .../mods/kubejs/block/BlockTintFunction.java | 15 +++++++------ .../client/BlockTintFunctionWrapper.java | 13 +++++++++++ .../kubejs/client/ClientBlockTintColors.java | 22 ------------------- 3 files changed, 21 insertions(+), 29 deletions(-) delete mode 100644 src/main/java/dev/latvian/mods/kubejs/client/ClientBlockTintColors.java diff --git a/src/main/java/dev/latvian/mods/kubejs/block/BlockTintFunction.java b/src/main/java/dev/latvian/mods/kubejs/block/BlockTintFunction.java index 38dd7b87f..062d98d7f 100644 --- a/src/main/java/dev/latvian/mods/kubejs/block/BlockTintFunction.java +++ b/src/main/java/dev/latvian/mods/kubejs/block/BlockTintFunction.java @@ -1,9 +1,9 @@ package dev.latvian.mods.kubejs.block; +import dev.latvian.mods.kubejs.client.BlockTintFunctionWrapper; import dev.latvian.mods.kubejs.color.KubeColor; import dev.latvian.mods.kubejs.color.SimpleColor; import dev.latvian.mods.kubejs.color.SimpleColorWithAlpha; -import dev.latvian.mods.kubejs.client.ClientBlockTintColors; import dev.latvian.mods.kubejs.plugin.builtin.wrapper.ColorWrapper; import dev.latvian.mods.rhino.BaseFunction; import dev.latvian.mods.rhino.Context; @@ -13,6 +13,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockAndLightGetter; import net.minecraft.world.level.FoliageColor; import net.minecraft.world.level.GrassColor; import net.minecraft.world.level.block.RedStoneWireBlock; @@ -27,7 +28,7 @@ public interface BlockTintFunction { TypeInfo TYPE_INFO = TypeInfo.of(BlockTintFunction.class); @Nullable - KubeColor getColor(BlockState state, @Nullable Object level, @Nullable BlockPos pos, int index); + KubeColor getColor(BlockState state, @Nullable BlockAndLightGetter level, @Nullable BlockPos pos, int index); default int getMaxTintIndex() { return 0; @@ -35,7 +36,7 @@ default int getMaxTintIndex() { record Fixed(KubeColor color) implements BlockTintFunction { @Override - public KubeColor getColor(BlockState state, @Nullable Object level, @Nullable BlockPos pos, int index) { + public KubeColor getColor(BlockState state, @Nullable BlockAndLightGetter level, @Nullable BlockPos pos, int index) { return color; } } @@ -44,7 +45,7 @@ class Mapped implements BlockTintFunction { public final Int2ObjectMap<@Nullable BlockTintFunction> map = new Int2ObjectArrayMap<>(1); @Override - public @Nullable KubeColor getColor(BlockState state, @Nullable Object level, @Nullable BlockPos pos, int index) { + public @Nullable KubeColor getColor(BlockState state, @Nullable BlockAndLightGetter level, @Nullable BlockPos pos, int index) { var f = map.get(index); return f == null ? null : f.getColor(state, level, pos, index); } @@ -61,13 +62,13 @@ public int getMaxTintIndex() { } } - BlockTintFunction GRASS = (s, l, p, i) -> new SimpleColor(l == null || p == null ? GrassColor.get(0.5, 1.0) : ClientBlockTintColors.getAverageGrassColor(l, p)); + BlockTintFunction GRASS = (s, l, p, i) -> new SimpleColor(l == null || p == null ? GrassColor.get(0.5, 1.0) : BlockTintFunctionWrapper.getAverageGrassColor(l, p)); KubeColor DEFAULT_FOLIAGE_COLOR = new SimpleColor(FoliageColor.FOLIAGE_DEFAULT); - BlockTintFunction FOLIAGE = (s, l, p, i) -> l == null || p == null ? DEFAULT_FOLIAGE_COLOR : new SimpleColor(ClientBlockTintColors.getAverageFoliageColor(l, p)); + BlockTintFunction FOLIAGE = (s, l, p, i) -> l == null || p == null ? DEFAULT_FOLIAGE_COLOR : new SimpleColor(BlockTintFunctionWrapper.getAverageFoliageColor(l, p)); Fixed EVERGREEN_FOLIAGE = new Fixed(new SimpleColor(FoliageColor.FOLIAGE_EVERGREEN)); Fixed BIRCH_FOLIAGE = new Fixed(new SimpleColor(FoliageColor.FOLIAGE_BIRCH)); Fixed MANGROVE_FOLIAGE = new Fixed(new SimpleColor(FoliageColor.FOLIAGE_MANGROVE)); - BlockTintFunction WATER = (s, l, p, i) -> l == null || p == null ? null : new SimpleColorWithAlpha(ClientBlockTintColors.getAverageWaterColor(l, p)); + BlockTintFunction WATER = (s, l, p, i) -> l == null || p == null ? null : new SimpleColorWithAlpha(BlockTintFunctionWrapper.getAverageWaterColor(l, p)); @Nullable KubeColor[] REDSTONE_COLORS = new KubeColor[16]; BlockTintFunction REDSTONE = (state, level, pos, index) -> { if (REDSTONE_COLORS[0] == null) { diff --git a/src/main/java/dev/latvian/mods/kubejs/client/BlockTintFunctionWrapper.java b/src/main/java/dev/latvian/mods/kubejs/client/BlockTintFunctionWrapper.java index de84b6ed1..31847e9bd 100644 --- a/src/main/java/dev/latvian/mods/kubejs/client/BlockTintFunctionWrapper.java +++ b/src/main/java/dev/latvian/mods/kubejs/client/BlockTintFunctionWrapper.java @@ -2,11 +2,24 @@ import dev.latvian.mods.kubejs.block.BlockTintFunction; import net.minecraft.client.color.block.BlockTintSource; +import net.minecraft.client.renderer.BiomeColors; import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.state.BlockState; public record BlockTintFunctionWrapper(BlockTintFunction function, int layerIndex) implements BlockTintSource { + public static int getAverageGrassColor(BlockGetter level, BlockPos pos) { + return BiomeColors.getAverageGrassColor((BlockAndTintGetter) level, pos); + } + + public static int getAverageFoliageColor(BlockGetter level, BlockPos pos) { + return BiomeColors.getAverageFoliageColor((BlockAndTintGetter) level, pos); + } + + public static int getAverageWaterColor(BlockGetter level, BlockPos pos) { + return BiomeColors.getAverageWaterColor((BlockAndTintGetter) level, pos); + } @Override public int color(BlockState state) { diff --git a/src/main/java/dev/latvian/mods/kubejs/client/ClientBlockTintColors.java b/src/main/java/dev/latvian/mods/kubejs/client/ClientBlockTintColors.java deleted file mode 100644 index c4277a46e..000000000 --- a/src/main/java/dev/latvian/mods/kubejs/client/ClientBlockTintColors.java +++ /dev/null @@ -1,22 +0,0 @@ -package dev.latvian.mods.kubejs.client; - -import net.minecraft.client.renderer.BiomeColors; -import net.minecraft.client.renderer.block.BlockAndTintGetter; -import net.minecraft.core.BlockPos; - -public final class ClientBlockTintColors { - private ClientBlockTintColors() { - } - - public static int getAverageGrassColor(Object level, BlockPos pos) { - return BiomeColors.getAverageGrassColor((BlockAndTintGetter) level, pos); - } - - public static int getAverageFoliageColor(Object level, BlockPos pos) { - return BiomeColors.getAverageFoliageColor((BlockAndTintGetter) level, pos); - } - - public static int getAverageWaterColor(Object level, BlockPos pos) { - return BiomeColors.getAverageWaterColor((BlockAndTintGetter) level, pos); - } -}