package net.minecraft.client.renderer.entity; import com.mojang.blaze3d.vertex.PoseStack; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.state.FallingBlockRenderState; import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.item.FallingBlockEntity; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; @Environment(EnvType.CLIENT) public class FallingBlockRenderer extends EntityRenderer { public FallingBlockRenderer(final EntityRendererProvider.Context context) { super(context); this.shadowRadius = 0.5F; } public boolean shouldRender(final FallingBlockEntity entity, final Frustum culler, final double camX, final double camY, final double camZ) { return !super.shouldRender(entity, culler, camX, camY, camZ) ? false : entity.getBlockState() != entity.level().getBlockState(entity.blockPosition()); } public void submit( final FallingBlockRenderState state, final PoseStack poseStack, final SubmitNodeCollector submitNodeCollector, final CameraRenderState camera ) { BlockState blockState = state.movingBlockRenderState.blockState; if (blockState.getRenderShape() == RenderShape.MODEL) { poseStack.pushPose(); poseStack.translate(-0.5, 0.0, -0.5); submitNodeCollector.submitMovingBlock(poseStack, state.movingBlockRenderState, state.outlineColor); poseStack.popPose(); super.submit(state, poseStack, submitNodeCollector, camera); } } public FallingBlockRenderState createRenderState() { return new FallingBlockRenderState(); } public void extractRenderState(final FallingBlockEntity entity, final FallingBlockRenderState state, final float partialTicks) { super.extractRenderState(entity, state, partialTicks); BlockPos pos = BlockPos.containing(entity.getX(), entity.getBoundingBox().maxY, entity.getZ()); state.movingBlockRenderState.randomSeedPos = entity.getStartPos(); state.movingBlockRenderState.blockPos = pos; state.movingBlockRenderState.blockState = entity.getBlockState(); if (entity.level() instanceof ClientLevel clientLevel) { state.movingBlockRenderState.biome = clientLevel.getBiome(pos); state.movingBlockRenderState.cardinalLighting = clientLevel.cardinalLighting(); state.movingBlockRenderState.lightEngine = clientLevel.getLightEngine(); } } }