From 8a942276e7852d58fa220de73acffb72cd3969ea Mon Sep 17 00:00:00 2001 From: covers1624 Date: Fri, 7 Feb 2025 20:14:19 +1030 Subject: [PATCH 1/2] Deprecate block model bypass hax for removal. Embed embeddium compat. --- build.gradle | 3 ++ .../lib/internal/mixin/EmbeddiumCCLMixin.java | 21 +++++++++++ .../render/block/BlockRenderingRegistry.java | 37 ++++++++++++++++++- .../block/CCBlockRendererDispatcher.java | 3 ++ .../lib/render/block/ICCBlockRenderer.java | 15 ++++++++ src/main/resources/mixins.codechickenlib.json | 3 +- 6 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 src/main/java/codechicken/lib/internal/mixin/EmbeddiumCCLMixin.java diff --git a/build.gradle b/build.gradle index 9d2e7a48..64cd6b72 100644 --- a/build.gradle +++ b/build.gradle @@ -73,6 +73,7 @@ repositories { mavenLocal() maven { url "https://maven.covers1624.net/" } maven { url "https://maven.blamejared.com/" } + maven { url "https://api.modrinth.com/maven" } } dependencies { @@ -83,6 +84,8 @@ dependencies { } } + compileOnly 'maven.modrinth:embeddium:1.0.15+mc1.21.1' + compileOnly("mezz.jei:jei-${mc_version}-neoforge:${jei_version}") { transitive false } diff --git a/src/main/java/codechicken/lib/internal/mixin/EmbeddiumCCLMixin.java b/src/main/java/codechicken/lib/internal/mixin/EmbeddiumCCLMixin.java new file mode 100644 index 00000000..4fff0da7 --- /dev/null +++ b/src/main/java/codechicken/lib/internal/mixin/EmbeddiumCCLMixin.java @@ -0,0 +1,21 @@ +package codechicken.lib.internal.mixin; + +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import org.embeddedt.embeddium.compat.ccl.CCLCompat; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + +/** + * Created by covers1624 on 2/7/25. + */ +@Mixin (CCLCompat.class) +public class EmbeddiumCCLMixin { + + /** + * @author covers1624 + * @reason Its broken and CCL ships its own. + */ + @Overwrite + public static void onClientSetup(FMLClientSetupEvent event) { + } +} diff --git a/src/main/java/codechicken/lib/render/block/BlockRenderingRegistry.java b/src/main/java/codechicken/lib/render/block/BlockRenderingRegistry.java index 82149dd3..b83bcb57 100644 --- a/src/main/java/codechicken/lib/render/block/BlockRenderingRegistry.java +++ b/src/main/java/codechicken/lib/render/block/BlockRenderingRegistry.java @@ -1,19 +1,23 @@ package codechicken.lib.render.block; +import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.BlockRenderDispatcher; -import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.material.Fluid; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.fml.ModList; +import org.embeddedt.embeddium.api.BlockRendererRegistry; +import org.jetbrains.annotations.ApiStatus.ScheduledForRemoval; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; /** @@ -23,6 +27,8 @@ * * @see ICCBlockRenderer */ +@Deprecated(forRemoval = true) // No replacement. +@ScheduledForRemoval (inVersion = "mc 1.21.2+") public class BlockRenderingRegistry { private static boolean initialized = false; @@ -39,6 +45,10 @@ public static void init() { mc.blockRenderer = new CCBlockRendererDispatcher(parentDispatcher, mc.getBlockColors()); initialized = true; } + + if (ModList.get().isLoaded("embeddium")) { + EmbeddiumSupport.init(); + } } /** @@ -51,6 +61,7 @@ public static void init() { * @param renderer The {@link ICCBlockRenderer}. * @throws IllegalArgumentException If the same Block is registered twice. */ + @Deprecated // No replacement. Use a mixin. public static synchronized void registerRenderer(Block block, ICCBlockRenderer renderer) { ICCBlockRenderer prev = blockRenderers.get(block); if (prev != null) { @@ -69,6 +80,7 @@ public static synchronized void registerRenderer(Block block, ICCBlockRenderer r * @param renderer The {@link ICCBlockRenderer}. * @throws IllegalArgumentException If the same Fluid is registered twice. */ + @Deprecated // No replacement. Use a mixin. public static synchronized void registerRenderer(Fluid fluid, ICCBlockRenderer renderer) { ICCBlockRenderer prev = fluidRenderers.get(fluid); if (prev != null) { @@ -83,6 +95,7 @@ public static synchronized void registerRenderer(Fluid fluid, ICCBlockRenderer r * * @param renderer The {@link ICCBlockRenderer}. */ + @Deprecated // No replacement. Use a mixin. public static synchronized void registerGlobalRenderer(ICCBlockRenderer renderer) { globalRenderers.add(renderer); } @@ -114,4 +127,26 @@ static ICCBlockRenderer findFor(Fluid fluid, Predicate pred) { return null; } + + private static class EmbeddiumSupport { + + private static final Map ADAPTERS = new ConcurrentHashMap<>(); + private static final ThreadLocal POSE_STACK_CACHE = ThreadLocal.withInitial(PoseStack::new); + + private static BlockRendererRegistry.Renderer adapt(ICCBlockRenderer renderer) { + return ADAPTERS.computeIfAbsent(renderer, e -> (ctx, random, consumer) -> { + e.renderBlock(ctx.state(), ctx.pos(), ctx.world(), POSE_STACK_CACHE.get(), consumer, random, ctx.modelData(), ctx.renderLayer()); + return BlockRendererRegistry.RenderResult.OVERRIDE; + }); + } + + public static void init() { + BlockRendererRegistry.instance().registerRenderPopulator((resultList, ctx) -> { + ICCBlockRenderer renderer = BlockRenderingRegistry.findFor(ctx.state().getBlock(), e -> e.canHandleBlock(ctx.world(), ctx.pos(), ctx.state(), ctx.renderLayer())); + if (renderer != null) { + resultList.add(adapt(renderer)); + } + }); + } + } } diff --git a/src/main/java/codechicken/lib/render/block/CCBlockRendererDispatcher.java b/src/main/java/codechicken/lib/render/block/CCBlockRendererDispatcher.java index ecfc11d3..051ffe82 100644 --- a/src/main/java/codechicken/lib/render/block/CCBlockRendererDispatcher.java +++ b/src/main/java/codechicken/lib/render/block/CCBlockRendererDispatcher.java @@ -26,12 +26,15 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.ApiStatus.ScheduledForRemoval; import java.util.concurrent.TimeUnit; /** * Created by covers1624 on 8/09/2016. */ +@Deprecated +@ScheduledForRemoval (inVersion = "mc 1.21.2+") public class CCBlockRendererDispatcher extends BlockRenderDispatcher { private static final Logger logger = LogManager.getLogger(); diff --git a/src/main/java/codechicken/lib/render/block/ICCBlockRenderer.java b/src/main/java/codechicken/lib/render/block/ICCBlockRenderer.java index a07b21a6..1ed00fcf 100644 --- a/src/main/java/codechicken/lib/render/block/ICCBlockRenderer.java +++ b/src/main/java/codechicken/lib/render/block/ICCBlockRenderer.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; import net.neoforged.neoforge.client.model.data.ModelData; +import org.jetbrains.annotations.ApiStatus.ScheduledForRemoval; import org.jetbrains.annotations.Nullable; /** @@ -22,7 +23,14 @@ * Created by covers1624 on 8/09/2016. * * @see BlockRenderingRegistry + * @deprecated Unfortunately, this has become a maintenance and compatability burden. Mods like Sodium + * are in every single modpack, and we can't realistically tell people not to use it. It's possible + * a Neo api may pop up that allows features similar to this API. But I'm not going to hold my breath. + * If someone still requires the functionality that this system provides, they should implement mixins + * themselves, or Sodium/Embeddium compatability. */ +@Deprecated (forRemoval = true) +@ScheduledForRemoval (inVersion = "mc 1.21.2+") public interface ICCBlockRenderer { //region Block @@ -36,6 +44,7 @@ public interface ICCBlockRenderer { * @param renderType The {@link RenderType}, {@code null} for breaking. * @return If you wish to render the BlockState. */ + @Deprecated boolean canHandleBlock(BlockAndTintGetter world, BlockPos pos, BlockState blockState, @Nullable RenderType renderType); /** @@ -53,6 +62,7 @@ public interface ICCBlockRenderer { * @param data Any ModelData. * @param renderType The {@link RenderType}, {@code null} for breaking. */ + @Deprecated void renderBlock(BlockState state, BlockPos pos, BlockAndTintGetter world, PoseStack mStack, VertexConsumer builder, RandomSource random, ModelData data, @Nullable RenderType renderType); /** @@ -66,6 +76,7 @@ public interface ICCBlockRenderer { * @param builder The {@link VertexConsumer} to add quads to. * @param data Any ModelData. */ + @Deprecated default void renderBreaking(BlockState state, BlockPos pos, BlockAndTintGetter world, PoseStack mStack, VertexConsumer builder, ModelData data) { CCRenderState ccrs = CCRenderState.instance(); ccrs.overlay = OverlayTexture.NO_OVERLAY; @@ -85,6 +96,7 @@ default void renderBreaking(BlockState state, BlockPos pos, BlockAndTintGetter w * @param state The state. * @return If you wish to render this block. */ + @Deprecated // No replacement. Use a mixin. default boolean canHandleEntity(BlockState state) { return false; } @@ -101,6 +113,7 @@ default boolean canHandleEntity(BlockState state) { * @param data Any ModelData. * @param renderType The {@link RenderType} may be {@code null}. */ + @Deprecated // No replacement. Use a mixin. default void renderEntity(BlockState state, PoseStack nStack, MultiBufferSource builder, int packedLight, int packedOverlay, ModelData data, @Nullable RenderType renderType) { } //endregion @@ -115,6 +128,7 @@ default void renderEntity(BlockState state, PoseStack nStack, MultiBufferSource * @param fluidState The {@link FluidState}. * @return If you wish to render the {@link FluidState}. */ + @Deprecated // No replacement. Use a mixin. default boolean canHandleFluid(BlockAndTintGetter world, BlockPos pos, BlockState blockState, FluidState fluidState) { return false; } @@ -131,6 +145,7 @@ default boolean canHandleFluid(BlockAndTintGetter world, BlockPos pos, BlockStat * @param blockState The {@link BlockState} * @param fluidState The {@link FluidState} */ + @Deprecated // No replacement. Use a mixin. default void renderFluid(BlockPos pos, BlockAndTintGetter world, VertexConsumer builder, BlockState blockState, FluidState fluidState) { } //endregion } diff --git a/src/main/resources/mixins.codechickenlib.json b/src/main/resources/mixins.codechickenlib.json index bd87c7df..a0c48fef 100644 --- a/src/main/resources/mixins.codechickenlib.json +++ b/src/main/resources/mixins.codechickenlib.json @@ -9,6 +9,7 @@ "dev.GameNarratorMixin", "ItemRendererMixin", "MinecraftMixin", - "ShaderInstanceMixin" + "ShaderInstanceMixin", + "EmbeddiumCCLMixin" ] } From 01880873739a4e380fa525347a033f05d8b80337 Mon Sep 17 00:00:00 2001 From: covers1624 Date: Sat, 8 Feb 2025 03:35:24 +1030 Subject: [PATCH 2/2] Make the mixin safer, smol refactor. --- .../lib/internal/mixin/{ => compat}/EmbeddiumCCLMixin.java | 6 ++++-- src/main/resources/mixins.codechickenlib.json | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) rename src/main/java/codechicken/lib/internal/mixin/{ => compat}/EmbeddiumCCLMixin.java (77%) diff --git a/src/main/java/codechicken/lib/internal/mixin/EmbeddiumCCLMixin.java b/src/main/java/codechicken/lib/internal/mixin/compat/EmbeddiumCCLMixin.java similarity index 77% rename from src/main/java/codechicken/lib/internal/mixin/EmbeddiumCCLMixin.java rename to src/main/java/codechicken/lib/internal/mixin/compat/EmbeddiumCCLMixin.java index 4fff0da7..412f1820 100644 --- a/src/main/java/codechicken/lib/internal/mixin/EmbeddiumCCLMixin.java +++ b/src/main/java/codechicken/lib/internal/mixin/compat/EmbeddiumCCLMixin.java @@ -1,15 +1,17 @@ -package codechicken.lib.internal.mixin; +package codechicken.lib.internal.mixin.compat; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import org.embeddedt.embeddium.compat.ccl.CCLCompat; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Pseudo; /** * Created by covers1624 on 2/7/25. */ +@Pseudo @Mixin (CCLCompat.class) -public class EmbeddiumCCLMixin { +abstract class EmbeddiumCCLMixin { /** * @author covers1624 diff --git a/src/main/resources/mixins.codechickenlib.json b/src/main/resources/mixins.codechickenlib.json index a0c48fef..3b3388c5 100644 --- a/src/main/resources/mixins.codechickenlib.json +++ b/src/main/resources/mixins.codechickenlib.json @@ -10,6 +10,6 @@ "ItemRendererMixin", "MinecraftMixin", "ShaderInstanceMixin", - "EmbeddiumCCLMixin" + "compat.EmbeddiumCCLMixin" ] }