• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

CyclopsMC / IntegratedDynamics / 24206420901

09 Apr 2026 06:23PM UTC coverage: 53.633% (-0.02%) from 53.655%
24206420901

push

github

web-flow
Fix NPE crash when rendering fluids with null fluidTintSource (#1648)

Closes #1646

3051 of 8941 branches covered (34.12%)

Branch coverage included in aggregate %.

18702 of 31618 relevant lines covered (59.15%)

3.07 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/main/java/org/cyclops/integrateddynamics/client/render/blockentity/RenderBlockEntityDryingBasin.java
1
package org.cyclops.integrateddynamics.client.render.blockentity;
2

3
import com.mojang.blaze3d.vertex.PoseStack;
4
import com.mojang.math.Axis;
5
import net.minecraft.client.Minecraft;
6
import net.minecraft.client.renderer.SubmitNodeCollector;
7
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
8
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
9
import net.minecraft.client.renderer.blockentity.state.BlockEntityRenderState;
10
import net.minecraft.client.renderer.feature.ModelFeatureRenderer;
11
import net.minecraft.client.renderer.item.ItemStackRenderState;
12
import net.minecraft.client.renderer.rendertype.RenderTypes;
13
import net.minecraft.client.renderer.state.level.CameraRenderState;
14
import net.minecraft.client.renderer.texture.OverlayTexture;
15
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
16
import net.minecraft.core.Direction;
17
import net.minecraft.world.item.ItemDisplayContext;
18
import net.minecraft.world.item.ItemStack;
19
import net.minecraft.world.level.Level;
20
import net.minecraft.world.phys.Vec3;
21
import net.neoforged.neoforge.fluids.FluidStack;
22
import org.apache.commons.lang3.tuple.Triple;
23
import org.cyclops.cyclopscore.helper.IModHelpers;
24
import org.cyclops.cyclopscore.helper.IModHelpersNeoForge;
25
import org.cyclops.integrateddynamics.blockentity.BlockEntityDryingBasin;
26
import org.jetbrains.annotations.Nullable;
27

28
/**
29
 * Renderer for the item inside the {@link org.cyclops.integrateddynamics.block.BlockDryingBasin}.
30
 *
31
 * @author rubensworks
32
 *
33
 */
34
public class RenderBlockEntityDryingBasin implements BlockEntityRenderer<BlockEntityDryingBasin, RenderBlockEntityDryingBasin.RenderState> {
35

36
    public RenderBlockEntityDryingBasin(BlockEntityRendererProvider.Context context) {
×
37

38
    }
×
39

40
    @Override
41
    public RenderState createRenderState() {
42
        return new RenderState();
×
43
    }
44

45
    @Override
46
    public void extractRenderState(BlockEntityDryingBasin blockEntity, RenderState renderState, float partialTick, Vec3 cameraPosition, @Nullable ModelFeatureRenderer.CrumblingOverlay breakProgress) {
47
        BlockEntityRenderer.super.extractRenderState(blockEntity, renderState, partialTick, cameraPosition, breakProgress);
×
48
        renderState.itemStack = blockEntity.getInventory().getItem(0);
×
49
        renderState.fluidStack = blockEntity.getTank().getFluid();
×
50
        renderState.rotation = blockEntity.getRandomRotation();
×
51
        renderState.level = blockEntity.getLevel();
×
52
    }
×
53

54
    @Override
55
    public void submit(RenderState renderState, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState cameraRenderState) {
56
        if(!renderState.itemStack.isEmpty()) {
×
57
            poseStack.pushPose();
×
58
            poseStack.translate(-0.5F, -0.5F, -0.5F);
×
59
            renderItem(poseStack, submitNodeCollector, renderState);
×
60
            poseStack.popPose();
×
61
        }
62

63
        FluidStack fluid = renderState.fluidStack;
×
64
        IModHelpersNeoForge.get().getRenderHelpers().renderFluidContext(fluid, poseStack, () -> {
×
65
            float height = (float) ((fluid.getAmount() * 0.7D) / IModHelpersNeoForge.get().getFluidHelpers().getBucketVolume() + 0.23D + 0.01D);
×
66
            int brightness = Math.max(renderState.lightCoords, fluid.getFluid().getFluidType().getLightLevel(fluid));
×
67
            int l2 = brightness >> 0x10 & 0xFFFF;
×
68
            int i3 = brightness & 0xFFFF;
×
69

70
            TextureAtlasSprite icon = IModHelpersNeoForge.get().getRenderHelpers().getFluidIcon(fluid, Direction.UP);
×
71
            var fluidTintSource = Minecraft.getInstance().getModelManager().getFluidStateModelSet().get(fluid.getFluid().defaultFluidState()).fluidTintSource();
×
72
            Triple<Float, Float, Float> color = IModHelpers.get().getBaseHelpers().intToRGB(fluidTintSource != null ? fluidTintSource.colorAsStack(fluid) : 0xFFFFFFFF);
×
73

74
            submitNodeCollector.submitCustomGeometry(poseStack, RenderTypes.text(icon.atlasLocation()), (pose, vb) -> {
×
75
                vb.addVertex(pose, 0.0625F, height, 0.0625F).setColor(color.getLeft(), color.getMiddle(), color.getRight(), 1).setUv(icon.getU0(), icon.getV1()).setUv2(l2, i3);
×
76
                vb.addVertex(pose, 0.0625F, height, 0.9375F).setColor(color.getLeft(), color.getMiddle(), color.getRight(), 1).setUv(icon.getU0(), icon.getV0()).setUv2(l2, i3);
×
77
                vb.addVertex(pose, 0.9375F, height, 0.9375F).setColor(color.getLeft(), color.getMiddle(), color.getRight(), 1).setUv(icon.getU1(), icon.getV0()).setUv2(l2, i3);
×
78
                vb.addVertex(pose, 0.9375F, height, 0.0625F).setColor(color.getLeft(), color.getMiddle(), color.getRight(), 1).setUv(icon.getU1(), icon.getV1()).setUv2(l2, i3);
×
79
            });
×
80
        });
×
81
    }
×
82

83
    private void renderItem(PoseStack poseStack, SubmitNodeCollector submitNodeCollector, RenderState renderStateDryingBasin) {
84
        ItemStackRenderState renderState = new ItemStackRenderState();
×
85
        Minecraft.getInstance().getItemModelResolver().updateForTopItem(renderState, renderStateDryingBasin.itemStack, ItemDisplayContext.FIXED, renderStateDryingBasin.level, null, 0);
×
86

87
        if (renderState.isOversizedInGui()) {
×
88
            poseStack.translate(1F, 1.2F, 1F);
×
89
            poseStack.scale(1.2F, 1.2F, 1.2F);
×
90
        } else {
91
            poseStack.translate(1F, 1.2F, 1F);
×
92
            poseStack.mulPose(Axis.XP.rotationDegrees(25F));
×
93
            poseStack.mulPose(Axis.YP.rotationDegrees(25F));
×
94
            poseStack.mulPose(Axis.YP.rotationDegrees(renderStateDryingBasin.rotation));
×
95
        }
96

97
        renderState.submit(poseStack, submitNodeCollector, 15728880, OverlayTexture.NO_OVERLAY, 0);
×
98
    }
×
99

100
    public static class RenderState extends BlockEntityRenderState {
×
101
        public ItemStack itemStack;
102
        public FluidStack fluidStack;
103
        public float rotation;
104
        public Level level;
105
    }
106

107
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc